我有两个列表a和另一个子列表b:
a <- list(c("aa","bb","cc"), c("a","b","c","d","e"))
b <- list(c("aa","cc"),c("a","b","c"))
我想从a中提取b,结果应该像
list(c("bb"), c("d","e")
我尝试过:
1) Map(`[`, a, b)
2) map2(a, b, `[`)
3) sapply(names(a), function(x) a[[x]][,b[[x]], drop = FALSE])
但是它们都不起作用。感谢您的帮助和支持。
答案 0 :(得分:2)
一种选择是将setdiff
与Map
一起使用
Map(setdiff, a, b)
#[[1]]
#[1] "bb"
#[[2]]
#[1] "d" "e"
或map2
library(purrr)
map2(a, b, setdiff)
关于使用names
循环,如果我们检查names(a)
或names(b)
,则为NULL
names(a)
#NULL
因为未设置名称。创建list
时,可以使用
a1 <- list(v1 = c("aa","bb","cc"), v2 = c("a","b","c","d","e"))
或在创建list
之后。可以使用
names(a1) <- c("v1", "v2")
或在创建列表时,使用setNames
a1 <- setNames(list(c("aa","bb","cc"), c("a","b","c","d","e")), c("v1", "v2"))
如果names
是NULL
,则通过NULL
循环将始终失败。更好的选择是遍历数字索引或list
的序列。我们不必担心名称是否设置。
lapply(seq_along(a), function(i) setdiff(a[[i]], b[[i]]))
答案 1 :(得分:0)
尝试:
Map(function(x, y) x[!x %in% y], a, b)
[[1]]
[1] "bb"
[[2]]
[1] "d" "e"