我对R还是很陌生,我很难在这个问题上正确地措辞,所以如果这是重复的话,我提前致歉。
我有一个定长列表的列表,所有列表都具有相同的命名成员。这是我的haystack
。
我有一个包含命名成员的列表,但其中一些缺失。这是我的needle
。
我想返回一个简单的TRUE / FALSE(如果needle
存在于中)haystack
。
例子:
这应该返回TRUE:所有needle
的成员都匹配,haystack[[1]]
即使缺少c
haystack <- list( list(a = 1, b = 2, c = 3), list(a = 4, b = 5, c = 6) )
needle <- list(a = 1, b = 2)
something(needle, haystack)
这应该返回FALSE:needle
的值match haystack[[1]]
,但是它们的名称不同
haystack <- list( list(a = 1, b = 2, c = 3), list(a = 4, b = 5, c = 6) )
needle <- list(x = 1, y = 2)
something(needle, haystack)
这应该返回FALSE:a = 1
并且b = 5
存在于haystack
,但不在同一列表中
haystack <- list( list(a = 1, b = 2, c = 3), list(a = 4, b = 5, c = 6) )
needle <- list(a = 1, b = 5)
something(needle, haystack)
到目前为止lapply(haystack, match, table = needle)
,我找到的最接近的是,但是A)不尊重名称匹配,B)我不确定如何将其结果转换为逻辑。
如果有一个库可以简化此过程,请随时将其合并到您的答案中。
这可能有点粗糙,但我认为它可以胜任。我们需要在此处解决的问题是要同时匹配名称和值。一种非常简单的方法是将它们粘贴在一起。
haystack2 <- lapply(haystack,function(x){
res <- paste0(names(x),x)
res
})
# > haystack2
# [[1]]
# [1] "a1" "b2" "c3"
#
# [[2]]
# [1] "a4" "b5" "c6"
needle2 <- paste0(names(needle),needle)
# > needle2
# [1] "a1" "b2"
然后我们可以使用lapply和%in%:
res <- any(sapply(haystack2,function(x) all(needle2 %in% x)))
# > res
# [1] TRUE
包装函数很容易,可以选择返回找到针的干草堆的索引。
something <- function(haystack, needle, position=F){
haystack2 <- lapply(haystack,function(x) paste0(names(x),x))
needle2 <- paste0(names(needle),needle)
res <- sapply(haystack2,function(x) all(needle2 %in% x))
if(position){
return(which(res))
}
return(any(res))
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句