【问题标题】:How to construct lists with a hierarchical structure in R?如何在 R 中构建具有层次结构的列表?
【发布时间】:2015-10-07 13:31:42
【问题描述】:

假设我有一个字符向量:

c("A01","A02","B0101","B0102","B02","C010101","C010102",
  "C010103","C010201","C010202","C02","C03",...)

它具有以下属性(由于我一般不知道如何解释我的问题,我将使用一些 xml 术语,如“节点”、“父”和“子”):

  1. 向量的元素是分层的。
  2. 考虑所有元素都包含在一个“根节点”中;每个元素的前导字母代表“根节点”的第一个“子节点”,后面每两个相邻的数字是前一个的“子节点”和下一个的“父节点”。
  3. 如向量所示,每个字符串的长度是不确定的,即每个“节点”内的世代数是不确定的。

现在,我想从向量构造一个具有以下属性的列表:

  1. 每个“父节点”都是一个包含其他列表(“子节点”)的列表。
  2. 每个列表的名称应与字符串中对应的字母或数字相同(参见下面的示例)。
  3. 树结构的最后一个后代应该是一个有名字但不一定有任何值的列表。

这是一个基于向量前 5 个元素的示例列表:

a<-list("A"=list("01"=NULL,"02"=NULL),"B"=list("01"=list("01"=NULL,"02"=NULL),"02"=NULL))  
>str(a)
List of 2
 $ A:List of 2
  ..$ 01: NULL
  ..$ 02: NULL
 $ B:List of 2
  ..$ 01:List of 2
  .. ..$ 01: NULL
  .. ..$ 02: NULL
  ..$ 02: NULL  

我想知道是否有任何 R 函数可以生成我想要的列表,并将向量作为输入;如果没有,如何写一个可以的?

【问题讨论】:

    标签: html xml r


    【解决方案1】:

    您可以递归调用处理列表的函数:

    dat <- c("A01","A02","B0101","B0102","B02")
    make.list <- function(x) {
      parent <- substr(x, 1, 2)
      remaining <- substr(x, 3, nchar(x))
      lapply(split(remaining, parent), function(y) {
        if (all(nchar(y) == 0)) NULL
        else make.list(y)
      })
    }
    parent <- substr(dat, 1, 1)
    remaining <- substr(dat, 2, nchar(dat))
    A <- lapply(split(remaining, parent), make.list)
    str(A)
    # List of 2
    #  $ A:List of 2
    #   ..$ 01: NULL
    #   ..$ 02: NULL
    #  $ B:List of 2
    #   ..$ 01:List of 2
    #   .. ..$ 01: NULL
    #   .. ..$ 02: NULL
    #   ..$ 02: NULL
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多