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