子集独特的情况下,基于多列(Subset with unique cases, based on m

2019-06-26 03:12发布

我想一个子集到数据帧只包含有三列的唯一组合行。 我的情况是类似中呈现的这个问题,但我希望保留其他列在我的数据也是如此。 这是我的例子:

> 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
标签: r unique subset