我有一个包含> 100列的数据框,我会通过只比较两列来找到唯一的行。我希望这是一个简单的,但我无法让自己与unique
或duplicated
一起工作。
在下面,我想只使用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
(我没有偏好保留哪些唯一行)
答案 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")]