如何解决检查 data.frame 是否是另一个 data.frame 的子集
假设我有以下查找表:
(lkp <- structure(list(a = c("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"),-1L),c3 = structure(list(a = c("a",b = c("a1",c4 = structure(list(a = c("a",b = c("a3",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 答案:
- How to check if a row is a subset of a data.frame?
- R merge data frames,allow inexact ID matching (e.g. with additional characters 1234 matches ab1234 )
尤其是第二个答案看起来很有希望。但是,我不需要近似匹配,而是需要某种 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。