r - 如何检测满足 A ∈ B 但 B ∉ A 的情况
问题描述
我有一个如下所示的数据集:
它显示了数据集之间的关系。1)。对于 col1,这意味着:cy1.CSV 中的所有变量也在数据集“cy1.CSV”、“cy24.CSV”、“cy6.CSV”中。2) dov.CSV: dov.CSV中的所有变量也在数据集“dov.CSV”、“dov_1.CSV” 2) dov_1.CSV: dov_1.CSV中的所有变量只能在数据集中找到“ dov_1.CSV"
df<-structure(list(cy1.CSV = c("cy1.CSV", "cy24.CSV", "cy6.CSV"),
cy2.CSV = c("cy2.CSV", NA, NA), cy24.CSV = c("cy1.CSV", "cy24.CSV",
"cy6.CSV"), cy3.CSV = c("cy3.CSV", NA, NA), cy6.CSV = c("cy1.CSV",
"cy24.CSV", "cy6.CSV"), dlt.CSV = c("dlt.CSV", NA, NA), dm.CSV = c("dm.CSV",
NA, NA), dov.CSV = c("dov.CSV", "dov_1.CSV", NA), dov_1.CSV = c("dov_1.CSV",
NA, NA), ds.CSV = c("ds.CSV", "ds_1.CSV", NA), ds_1.CSV = c("ds.CSV",
"ds_1.CSV", NA)), row.names = c(NA, -3L), class = c("tbl_df",
"tbl", "data.frame"))
我们是否可以找到满足的情况:A ∈ B,但 B ∉ A,在示例中。dov.CSV 属于 dov_1.CSV,dov_1.SCV 不属于 dov.CSV。也许找到一种方法将我们发现的内容放入列表或 data.frame 中。
解决方案
我们可以使用 的列名df
来检查每个文件是否%in%
是sapply
. 这将为我们提供一个方阵,告诉我们每个文件是否包含所有其他文件。
这样,可以直接使用数组索引来获取包含其他文件的文件:
tab <- `rownames<-`(sapply(df, function(x) names(df) %in% x), names(df))
ind <- which(tab, arr.ind = TRUE)
AinB <- data.frame(item = names(df)[ind[,2]], contains = names(df)[ind[,1]])
AinB
#> item contains
#> 1 cy1.CSV cy1.CSV
#> 2 cy1.CSV cy24.CSV
#> 3 cy1.CSV cy6.CSV
#> 4 cy2.CSV cy2.CSV
#> 5 cy24.CSV cy1.CSV
#> 6 cy24.CSV cy24.CSV
#> 7 cy24.CSV cy6.CSV
#> 8 cy3.CSV cy3.CSV
#> 9 cy6.CSV cy1.CSV
#> 10 cy6.CSV cy24.CSV
#> 11 cy6.CSV cy6.CSV
#> 12 dlt.CSV dlt.CSV
#> 13 dm.CSV dm.CSV
#> 14 dov.CSV dov.CSV
#> 15 dov.CSV dov_1.CSV
#> 16 dov_1.CSV dov_1.CSV
#> 17 ds.CSV ds.CSV
#> 18 ds.CSV ds_1.CSV
#> 19 ds_1.CSV ds.CSV
#> 20 ds_1.CSV ds_1.CSV
为了找到 A 在 B 中但反之不行的实例,我们做同样的事情,只是我们正在寻找tab
与其转置不同的索引:
ind2 <- which(tab & !t(tab), arr.ind = TRUE)
AinBnotBinA <- data.frame(item = names(df)[ind2[,2]],
contains = names(df)[ind2[,1]])
AinBnotBinA
#> item contains
#> 1 dov.CSV dov_1.CSV
由reprex 包于 2020-11-25 创建(v0.3.0)