【问题标题】:Replace all values of a recursive list with values of a vector用向量的值替换递归列表的所有值
【发布时间】:2015-07-22 16:56:43
【问题描述】:

说,我有以下递归列表:

rec_list <- list(list(rep(1,5), 10), list(rep(100, 4), 20:25))
rec_list
[[1]]
[[1]][[1]]
[1] 1 1 1 1 1

[[1]][[2]]
[1] 10


[[2]]
[[2]][[1]]
[1] 100 100 100 100

[[2]][[2]]
[1] 20 21 22 23 24 25

现在,我想用向量seq_along(unlist(rec_list)) 替换列表的所有值,并保留列表的结构。我尝试使用空索引子集,例如

rec_list[] <- seq_along(unlist(rec_list))

但这不起作用。

如何在保持列表原有结构的同时实现替换?

【问题讨论】:

    标签: r list recursion subset


    【解决方案1】:

    你可以使用relist:

    relist(seq_along(unlist(rec_list)), skeleton = rec_list)
    # [[1]]
    # [[1]][[1]]
    # [1] 1 2 3 4 5
    # 
    # [[1]][[2]]
    # [1] 6
    # 
    # 
    # [[2]]
    # [[2]][[1]]
    # [1]  7  8  9 10
    # 
    # [[2]][[2]]
    # [1] 11 12 13 14 15 16
    

    【讨论】:

    • 哦,拜托,你怎么这么快就找到了这个功能! :-0
    【解决方案2】:

    如果您想对嵌套列表的每个元素进行唯一索引,可以从rapply() 函数开始,它是apply() 系列的递归形式。这里我使用了一个特殊的函数,它可以在任何结构的列表中唯一索引

    rapply(rec_list, 
    local({i<-0; function(x) {i<<-i+length(x); i+seq_along(x)-length(x)}}),     
    how="replace")
    

    其他函数更简单,例如,如果您只想对每个子向量进行 seq_along

    rapply(rec_list, seq_along, how="replace")
    

    【讨论】:

      猜你喜欢
      • 2019-01-03
      • 2016-04-17
      • 2020-06-03
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 2022-10-14
      • 2021-10-08
      • 2019-12-14
      相关资源
      最近更新 更多