R 查找数据帧中包含另一个数据帧的行的所有元素的行

R 查找数据帧中包含另一个数据帧的行的所有元素的行,r,dataframe,R,Dataframe,我有一个包含三列的数据框,第二个包含两列 df1 <- data.frame(X1 = c('A', 'A', 'A', 'A', 'A', 'A', 'B'), X2 = c('B', 'B', 'B', 'C', 'C', 'D', 'C'), X3 = c('C', 'D', 'E', 'D', 'E', 'E', 'D')) df2 <- data.frame(X1 = c('A', 'A'),

我有一个包含三列的数据框,第二个包含两列

df1 <- data.frame(X1 = c('A', 'A', 'A', 'A', 'A', 'A', 'B'), 
                  X2 = c('B', 'B', 'B', 'C', 'C', 'D', 'C'), 
                  X3 = c('C', 'D', 'E', 'D', 'E', 'E', 'D'))

df2 <- data.frame(X1 = c('A', 'A'), 
                  X2 = c('B', 'D'))

df1您需要以某种方式进行循环。这里有一种使用
dplyr
purrr
的方法:

1.

for(iRow in seq_len(nrow(df2))){
  
  df1 <- df1 %>% 
    rowwise() %>% 
    filter(!all(as.character(df2[iRow,]) %in% c_across(everything())))
}
df2 %>% 
  rowwise() %>% 
  mutate(n = sum(map_int(transpose(df1), ~all(c_across(everything()) %in% .x))))
只需确保在第一部分之前完成第二部分,因为第一部分会删除行。此外,您还可以首先为
df2
的每一行检测要删除的行。通过这种方式,您可以对它们进行计数,然后将其移除

df2 <- df2 %>% 
  rowwise() %>% 
  mutate(
    indices = list(which(map_lgl(transpose(df1), ~all(c_across(everything()) %in% .x))))
  ) %>%
  ungroup() %>%
  mutate(n = map_int(indices, length))

df1 <- df2[["indices"]] %>%
  unlist() %>%
  unique() %>%
  "*"(-1) %>%
  df1[.,]

df2 <- df2 %>% select(-indices)
df2%
行()
变异(
索引=列表(其中(映射lgl(转置(df1))~all(跨越(所有内容())%in%.x)))
) %>%
解组()%>%
变异(n=map_int(索引,长度))
df1%
取消列表()%>%
唯一()%>%
"*"(-1) %>%
df1[,]
df2%选择(-index)

这里是使用
外部
+
相交

mat <- lengths(
  outer(
    asplit(df1, 1),
    asplit(df2, 1),
    Vectorize(intersect)
  )
) >= ncol(df2)
mat=ncol(df2)
你会得到

> subset(df1, !rowSums(mat))
  X1 X2 X3
5  A  C  E
7  B  C  D

> within(df2, cnt <- colSums(mat))
  X1 X2 cnt
1  A  B   3
2  A  D   3
>子集(df1,!行和(mat))
x1x2x3
5 A C E
7 B C D
>在(df2,cnt内使用apply:

对df2进行类似的循环匹配计数:

cbind(df2, 
      cnt = apply(df2, 1, function(i) sum(apply(df1, 1, function(j) all(i %in% j)))))
#   X1 X2 cnt
# 1  A  B   3
# 2  A  D   3
cbind(df2, 
      cnt = apply(df2, 1, function(i) sum(apply(df1, 1, function(j) all(i %in% j)))))
#   X1 X2 cnt
# 1  A  B   3
# 2  A  D   3