【问题标题】:Modifying specific elements in sublist without loop无循环修改子列表中的特定元素
【发布时间】:2018-10-23 05:57:10
【问题描述】:

我有一个列表,我正在尝试以特定方式进行修改。列表列表的组织方式类似于矩阵,但每个元素都是一个数字向量。我的目标是根据它们的位置只更新这些向量中的一小部分。例如更新某些子列表中的第 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

【问题讨论】:

    标签: r lapply


    【解决方案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 列表、combine 1:3 子列表中的值,并从第 4 个列表中过滤值。

    【讨论】:

    • 啊,很好。是的,这将满足我的需要。现在看起来很明显,我看到了。谢谢。
    猜你喜欢
    • 2013-10-17
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    相关资源
    最近更新 更多