繁体   English   中英

检查 data.frame 是否是另一个 data.frame 的子集

[英]Check if data.frame is a subset of another data.frame

假设我有以下查找表:

(lkp <- structure(list(a = c("a", "a", "a", "b", "c"),
                       b = c("a1 a2", "a3 a2", "a3", "a1", "a1")), 
                       row.names = c("lkp_1", "lkp_2", "lkp_3", "lkp_4", "lkp_5"), 
                       class = "data.frame"))
#       a     b
# lkp_1 a a1 a2
# lkp_2 a a3 a2
# lkp_3 a    a3
# lkp_4 b    a1
# lkp_5 c    a1 

我想检查另一个data.framex是否是lkp一个子集,还有一个重要的附加要求,即b列匹配意味着lkp$b只需要包含x$b

下面的例子应该清楚我的意思:

(chk <- list(c1 = structure(list(a = c("a", "a"), b = c("a2", "a2")), row.names = c(NA, -2L), class = "data.frame"), 
             c2 = structure(list(a = "b", b = "a1"), row.names = c(NA, -1L), class = "data.frame"), 
             c3 = structure(list(a = c("a", "a"), b = c("a1", "a1")), row.names = c(NA, -2L), class = "data.frame"), 
             c4 = structure(list(a = c("a", "a"), b = c("a3", "a2")), row.names = c(NA, -2L), class = "data.frame")))

# $c1
#   a  b
# 1 a a2
# 2 a a2

# $c2
#   a  b
# 1 b a1

# $c3
#   a  b
# 1 a a1
# 2 a a1

# $c4
#   a  b
# 1 a a3
# 2 a a2
  • chk$c1 :第 1 行匹配第lkp_1行(和lkp_2 ),因为列a相同,而lkp$b包含a2
  • chk$c2chk$c4匹配
  • chk$c3匹配。 虽然每一行都匹配lkp_1 ,但c4不是子集,因为lkp需要包含2个匹配的不同行。

原则上,我正在寻找合并(或连接),其中连接条件将使用某种模糊匹配。

我找到并阅读了这两个 SO 答案:

尤其是第二个答案看起来很有希望。 但是,我不需要近似匹配,而是需要某种does_contain关系而不是纯粹的平等。 那么也许regex解决方案会起作用?

预期结果

magic_is_subset_function <- function(chk, lkp) {
   # ...
}
sapply(chk, magic_is_subset_function, lkp = lkp)
# [1] TRUE TRUE FALSE TRUE
sapply(
    chk,
    function(v) {
        sum(
            rowSums(sapply(v$a, `==`, lkp$a) &
                sapply(v$b, grepl, x = lkp$b)) > 0
        ) >= nrow(v)
    }
)

要么

sapply(
    chk,
    function(v) {
        sum(
            colSums(
                do.call(
                    `&`,
                    Map(
                        function(x, y) outer(x, y, FUN = Vectorize(function(a, b) grepl(a, b))),
                        v,
                        lkp
                    )
                )
            ) > 0
        ) >= nrow(v)
    }
)

这使

   c1    c2    c3    c4 
 TRUE  TRUE FALSE FALSE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM