[英]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.frame
, x
是否是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$c2
和chk$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.