2015-06-08 78 views
1

假設我有一個特徵向量:如何在R中構建具有分層結構的列表?

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函數;如果沒有,如何寫一個可以?

回答

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