使用有关两个向量之间不重复级别的信息删除 df 行

  • 本文关键字:df 信息删除 之间 向量 两个 r
  • 更新时间 :
  • 英文 :

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个级别,因此不会"手动完成"。有人可以帮助我吗?

我认为这就是你想要的。本质上splitXY,然后查找每个集合中的所有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_byX并选择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]

最新更新