2016-02-19 134 views
2

我有一个数据集是这样的:删除重复的值的行的所有副本中的R

name position type 
A  12  S 
B  13  T 
C  12  S 
D  12  T 
E  11  S 
F  10  S 

我想删除重复同位置和类型行。

我试图使用duplicated函数查找重复的行,但我不知道如何删除所有行的重复值。

dup = db[duplicated(db[2:3]),] 

我想用同样的位置和类型,但不同的名称中删除行。 我所需的输出是:

name position type 
B  13  T 
D  12  T 
E  11  S 
F  10  S 
+0

你能发表一些代码吗? –

+2

类似的问题:http://stackoverflow.com/q/7854433/1191259 – Frank

+0

@akrun弗兰克链接到的问题是一个有用的相关帖子,但我不认为这应该被关闭,因为它不是一个确切的副本。那个返回重复的索引,这个删除它们。那个有向量的例子,这是关于data.frame的问题。这只会涉及重复变量的一个子集。 –

回答

4

duplicated返回TRUE只起重复值。要返回所有重复的元素,我们可能需要反向应用duplicated,即从最后一个值到第一个,并使用OR条件,即|,否定和子集数据集。

db[!(duplicated(db[2:3])|duplicated(db[2:3], fromLast=TRUE)),] 
# name position type 
# 2 B  13 T 
# 4 D  12 T 
# 5 E  11 S 
# 6 F  10 S 
+1

感谢akrun您的明确和有益的解释! – BlueSky

1

dplyr包使用直观,可读的代码。

这里的玩具例子,从mtcars取行,其中也有cylgear没有重复值:

library(dplyr) 
mtcars %>% 
    group_by(cyl, gear) %>% 
    filter(n() == 1) %>% 
    ungroup() 

Source: local data frame [2 x 11] 

    mpg cyl disp hp drat wt qsec vs am gear carb 
    (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) 
1 21.5  4 120.1 97 3.70 2.465 20.01  1  0  3  1 
2 19.7  6 145.0 175 3.62 2.770 15.50  0  1  5  6 

缸和齿轮的这两个组合都是唯一独特的,你可以用按钮确认:

mtcars %>% 
    count(cyl, gear)