df <- data.frame(X = c("a", "b", "c", "a", "b", "c", "a", "b", "c", "d" , "a", "b", "c", "d", "e"),
Y = c("w", "w", "w", "K", "K", "K", "L", "L", "L", "L", "Z", "Z", "Z", "Z", "Z"))
请注意,第一个向量有 5 个级别,第二个向量有 4 个级别。我的目标是选择具有所有向量 1 级别作为向量 2 的 df 线。也就是说,我想选择级别为"a"、"b"和"c"的行,因为"d"只出现两次"并且"只出现在向量 1 中"。
我试图列出一个包含公共级别的列表,并按子集只保留具有公共级别的行。但是,它不起作用,因为此级别列表不会生成我要删除的行的地址。前任:
common <- c ("a", "b", "c")
df2 <- df [c(common),]
在我的真实df中,共有64个级别,因此不会"手动完成"。有人可以帮助我吗?
我认为这就是你想要的。本质上split
X
Y
,然后查找每个集合中的所有intersect
值。
df[df$X %in% Reduce(intersect, split(df$X, df$Y)),]
# X Y
#1 a w
#2 b w
#3 c w
#4 a K
#5 b K
#6 c K
#7 a L
#8 b L
#9 c L
#11 a Z
#12 b Z
#13 c Z
另一种方法是group_by
X
并选择Y
中具有所有不同值的组。
library(dplyr)
df %>%
group_by(X) %>%
filter(n_distinct(Y) == n_distinct(.$Y))
# X Y
# <fct> <fct>
# 1 a w
# 2 b w
# 3 c w
# 4 a K
# 5 b K
# 6 c K
# 7 a L
# 8 b L
# 9 c L
#10 a Z
#11 b Z
#12 c Z
在基本R中,将使用ave
subset(df, as.logical(ave(as.character(Y), X,
FUN = function(x) length(unique(x)) == length(unique(Y)))))
使用data.table
library(data.table)
setDT(df)[, .SD[uniqueN(Y) == uniqueN(df$Y)], by = X]