R语言 基于多列的具有唯一事例的子集

2wnc66cl  于 2022-12-27  发布在  其他
关注(0)|答案(7)|浏览(145)

我想对 Dataframe 进行子集化,使其只包含具有三列唯一组合的行。我的情况与this问题中的情况类似,但我也想保留数据中的其他列。下面是我的示例:

> 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(here)中看到了一个相关的问题,关于如何做到这一点,但我在R中无法得到这个问题。我确信这很简单,但混乱的unique()和subset()并没有产生什么效果。

voase2hg

voase2hg1#

您可以使用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
41ik7eoe

41ik7eoe2#

使用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)
qlvxas9a

qlvxas9a3#

您可以使用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
gmxoilav

gmxoilav4#

是的,但是如果你有太多的数据,使用plyr和ddply是非常非常慢的。
你应该试试这样的东西:

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),]

在大多数情况下我们会更快。
测试一下然后告诉我们
有一些错误,但我猜你可以修复这些,只要你得到的想法。
我也尝试独特的和所有

dvtswwa3

dvtswwa35#

我知道这是一个很老的问题,但无论如何,我认为使用unique()函数的明显解决方案也应该在这里给出:

unique(df[1:3])

或按名称指定列:

unique(df[c("v1","v2","v3)]

...并指定行:

unique(df[,c("v1","v2","v3)]
pprl5pva

pprl5pva6#

如果您使用的是data.table,那么很容易使一个或多个变量具有唯一的大小写。

unique(DT, by = c("var1", "var2"))
dojqjjoe

dojqjjoe7#

一种不优雅但实用的方法是将给定行的条目粘贴在一起,并查找哪些是唯一(或非唯一)行,如下所示:

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)))

相关问题