如何通过子列表删除列表中的元素?

时间:2019-07-26 20:36:22

标签: r list extract

我有两个列表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])

但是它们都不起作用。感谢您的帮助和支持。

2 个答案:

答案 0 :(得分:2)

一种选择是将setdiffMap一起使用

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"))

如果namesNULL,则通过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"