如何在R中构建具有层次结构的列表?

时间:2015-06-08 16:38:11

标签: html xml r

假设我有一个字符向量:

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

并且它具有以下属性(因为我不知道如何解释我的问题一般,我会使用一些xml术语,如" node"," parent& #34;和"孩子"):

  1. 向量的元素是分层的。
  2. 考虑所有元素都包含在"根节点&#34 ;;每个元素的前导字母代表第一个"子节点" "根节点",并且随后的每两个相邻数字是" child"以及以及#34;父母"下一个。
  3. 如向量所示,每个字符串的长度是不确定的,即每个节点内的世代数"不确定。
  4. 现在,从矢量我想构建一个具有以下属性的列表:

    1. 每个"父节点"是包含其他列表的列表("子节点")。
    2. 每个列表的名称应与字符串中对应的字母或数字相同(请参阅下面的示例)。
    3. 树结构的最后一个后代应该是一个具有名称但不一定是任何值的列表。
    4. 这是一个基于向量的前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函数可以生成我想要的列表作为输入;如果没有,怎么写一个可以?

1 个答案:

答案 0 :(得分:0)

您可以通过递归方式调用处理列表的函数来执行此操作:

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