修改子列表中的特定元素而无需循环

时间:2018-10-23 05:57:10

标签: r lapply

我有一个列表列表,我正在尝试以特定方式对其进行修改。列表列表的组织类似于矩阵,但是每个元素都是数字向量。我的目标是根据它们的位置仅更新其中的少量向量。例如,更新某些子列表中的第4个元素。这是我要寻找的示例。为简单起见,我遗漏了很多元素。

 foo <- list(list(NA, NA, NA, c(2)),
        list(NA, NA, NA, c(1, 5, 9)),
        list(NA, NA, NA, c(1, 5, 9)),
        list(NA, NA, NA, c(7)),
        list(NA, NA, NA, c(5, 8, 9)),
        list(NA, NA, NA, c(1, 8, 9)))

假设我要从子列表3-6的第4个元素中删除9个,分别以系统的方式对应于元素foo[[4]][[4]]foo[[5]][[4]]foo[[6]][[4]]

我一直在尝试使用lapply做这样的事情。

lapply(foo, "[[", 4)[4:6] %>% lapply(function(x) x[!(x %in% 9)])

哪个工作正常,但是我还没有找到将这些更新的向量放回列表中的好方法,因此结果如下。我知道我可以使用循环来完成此操作,但是我希望避免使用它们,因为此过程将重复很多次,并且我认为有更好的方法可以做到这一点。

> foo
[[1]]
[[1]][[1]]
[1] NA

[[1]][[2]]
[1] NA

[[1]][[3]]
[1] NA

[[1]][[4]]
[1] 2

[[2]]
[[2]][[1]]
[1] NA

[[2]][[2]]
[1] NA

[[2]][[3]]
[1] NA

[[2]][[4]]
[1] 1 5 9


[[3]]
[[3]][[1]]
[1] NA

[[3]][[2]]
[1] NA

[[3]][[3]]
[1] NA

[[3]][[4]]
[1] 1 5 9


[[4]]
[[4]][[1]]
[1] NA

[[4]][[2]]
[1] NA

[[4]][[3]]
[1] NA

[[4]][[4]]
[1] 7


[[5]]
[[5]][[1]]
[1] NA

[[5]][[2]]
[1] NA

[[5]][[3]]
[1] NA

[[5]][[4]]
[1] 5 8


[[6]]
[[6]][[1]]
[1] NA

[[6]][[2]]
[1] NA

[[6]][[3]]
[1] NA

[[6]][[4]]
[1] 1 8

1 个答案:

答案 0 :(得分:1)

您可以这样做

foo[4:6] <- lapply(foo[4:6], function(x) c(x[1:3], list(x[[4]][!(x[[4]] %in% 9)])))


foo[4:6]
#[[1]]
#[[1]][[1]]
#[1] NA

#[[1]][[2]]
#[1] NA

#[[1]][[3]]
#[1] NA

#[[1]][[4]]
#[1] 7

#[[2]]
#[[2]][[1]]
#[1] NA

#[[2]][[2]]
#[1] NA

#[[2]][[3]]
#[1] NA

#[[2]][[4]]
#[1] 5 8
#......

我们仅更改4:6列表中的值,c组合1:3子列表,并从第4个列表中过滤值。