簡體   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