仅包含选定列的数据框上的唯一

时间:2012-03-30 14:22:34

标签: r unique

我有一个包含> 100列的数据框,我会通过只比较两列来找到唯一的行。我希望这是一个简单的,但我无法让自己与uniqueduplicated一起工作。

在下面,我想只使用id和id2唯一:

data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))

id id2 somevalue
1   1         x
1   1         y
3   4         z

我想获得:

id id2 somevalue
1   1         x
3   4         z

或:

id id2 somevalue
1   1         y
3   4         z

(我没有偏好保留哪些唯一行)

4 个答案:

答案 0 :(得分:99)

好的,如果您选择的非重复列中的哪个值无关紧要,这应该很简单:

dat <- data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))
> dat[!duplicated(dat[,c('id','id2')]),]
  id id2 somevalue
1  1   1         x
3  3   4         z

duplicated调用中,我只是传递dat中我不想重复的列。此代码将自动始终选择任何不明确值的 first 。 (在这种情况下,x。)

答案 1 :(得分:13)

使用unique()

dat <- data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))    
dat[row.names(unique(dat[,c("id", "id2")])),]

答案 2 :(得分:10)

这里有几个dplyr选项,它们根据列id和id2保留不重复的行:

library(dplyr)                                        
df %>% distinct(id, id2, .keep_all = TRUE)
df %>% group_by(id, id2) %>% filter(row_number() == 1)
df %>% group_by(id, id2) %>% slice(1)

答案 3 :(得分:1)

@Joran代码中的次要更新。
使用下面的代码,您可以避免歧义,而仅获得两列的唯一性:

dat <- data.frame(id=c(1,1,3), id2=c(1,1,4) ,somevalue=c("x","y","z"))    
dat[row.names(unique(dat[,c("id", "id2")])), c("id", "id2")]