我想一个子集到数据帧只包含有三列的唯一组合行。 我的情况是类似中呈现的这个问题,但我希望保留其他列在我的数据也是如此。 这是我的例子:
> df
v1 v2 v3 v4 v5
1 7 1 A 100 98
2 7 2 A 98 97
3 8 1 C NA 80
4 8 1 C 78 75
5 8 1 C 50 62
6 9 3 C 75 75
所请求的输出会是这样的,在那里我正在寻找基于V1,V2独特的情况下,只有V3:
> df.new
v1 v2 v3 v4 v5
1 7 1 A 100 98
2 7 2 A 98 97
3 8 1 C NA 80
6 9 3 C 75 75
如果我能恢复非唯一行时,将是巨大的:
> df.dupes
v1 v2 v3 v4 v5
3 8 1 C NA 80
4 8 1 C 78 75
5 8 1 C 50 62
我看到了如何做到这一点的SQL(一个相关的问题在这里 ),但我不能得到这个R.我敢肯定,这很简单,但具有独特的()和子集搞乱()一直没有收获。 提前致谢。
Answer 1:
您可以使用duplicated()
函数来找到独特的组合:
> df[!duplicated(df[1:3]),]
v1 v2 v3 v4 v5
1 7 1 A 100 98
2 7 2 A 98 97
3 8 1 C NA 80
6 9 3 C 75 75
只得到重复的,你可以在两个方向检查:
> df[duplicated(df[1:3]) | duplicated(df[1:3], fromLast=TRUE),]
v1 v2 v3 v4 v5
3 8 1 C NA 80
4 8 1 C 78 75
5 8 1 C 50 62
Answer 2:
您可以使用plyr
包:
library(plyr)
ddply(df, c("v1","v2","v3"), head, 1)
# v1 v2 v3 v4 v5
# 1 7 1 A 100 98
# 2 7 2 A 98 97
# 3 8 1 C NA 80
# 4 9 3 C 75 75
ddply(df, c("v1","v2","v3"), function(x) if(nrow(x)>1) x else NULL)
# v1 v2 v3 v4 v5
# 1 8 1 C NA 80
# 2 8 1 C 78 75
# 3 8 1 C 50 62
Answer 3:
使用dplyr
你可以这样做:
library(dplyr)
# distinct
df %>%
distinct(v1, v2, v3, .keep_all = T)
# non-distinct only
df %>%
group_by(v1, v2, v3) %>%
filter(n() > 1)
# exclude any non-distinct
df %>%
group_by(v1, v2, v3) %>%
filter(n() == 1)
Answer 4:
是的,但使用plyr和ddply是非常非常慢,如果你有太多的数据。
你SHD尝试这种东西:
df[ cbind( which(duplicated(df[1:3])), which(duplicated(df[1:3], fromLast=TRUE))),]
要么::
from = which(duplicated(df[1:3])
to = which(duplicated(df[1:3], fromLast=TRUE))
df[cbind(from,to),]
SHD是大部分更快。
测试一下,让我们知道
也有一些错误,但即时猜测,只要你的想法,你可以修复这些。
还尝试独特的和所有的
Answer 5:
非优雅而实用的方法是给定行的条目粘贴在一起,并发现这是唯一的(或者非唯一的)行,是这样的:
df.vector=apply(df,1,FUN=function(x) {paste(x,collapse="")})
df.table=table(df.vector)
然后得到的东西,如重复的指标:
which(df.vector%in%names(which(df.table>1)))
文章来源: Subset with unique cases, based on multiple columns