首页 > 解决方案 > 如何检测满足 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 中。

标签: r

解决方案


我们可以使用 的列名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)


推荐阅读