具有唯一案例的子集,基于多个列

use*_*761 39 r unique subset

我想将数据框子集化为仅包含具有三列唯一组合的行.我的情况类似于问题中提供的情况,但我还想保留数据中的其他列.这是我的例子:

> 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
Run Code Online (Sandbox Code Playgroud)

请求的输出将是这样的,我正在寻找仅基于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
Run Code Online (Sandbox Code Playgroud)

如果我可以恢复非常独特的行,那也很棒:

> 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
Run Code Online (Sandbox Code Playgroud)

我在sql(这里)中看到了一个相关的问题,但是我无法在R中得到这个.我确信这很简单,但是使用unique()和subset()搞乱并不富有成效.提前致谢.

Ken*_*ams 55

您可以使用该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
Run Code Online (Sandbox Code Playgroud)

要仅获取重复项,您可以在两个方向上进行检查:

> 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
Run Code Online (Sandbox Code Playgroud)

  • @ user3343907像这样:`df [!duplicated(df [c(1,3)]),]` (5认同)

sbh*_*bha 8

使用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)
Run Code Online (Sandbox Code Playgroud)


flo*_*del 5

您可以使用该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
Run Code Online (Sandbox Code Playgroud)