我想将数据框子集化为仅包含具有三列唯一组合的行.我的情况类似于此问题中提供的情况,但我还想保留数据中的其他列.这是我的例子:
> 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)
使用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)
您可以使用该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)