2016-04-30 12 views
1

をネストされたリストを作成し、私はこのような階層的なIDの文字ベクトルを持っている:R:文字ベクトルでのIDから

ids <- c("0","1","2","3","1.1","1.2","1.3","2.1","2.2","2.11","2.21","2.22") 

次のような階層構造がある:

1 
    1.1 
    1.2 
    1.3 
2 
    2.1 
     2.11 
    2.2 
     2.21 
     2.22 

私が使用したいですこの階層を視覚化するためにnetworkD3パッケージのdiagonalNetwork()しかしdiagonalNetwork()は、このような各ノードの子を定義するネストされたリストが必要です。

l <- list(name = "0", 
      children = list(
       list(name = "1", 
        children = list(
        list(name = "1.1"), 
        list(name = "1.2"), 
        list(name = "1.3") 
        ) 
      ), 
       list(name = "2", 
        children = list(
        list(name = "2.1", 
          children = list(
          list(name = "2.11") 
         ) 
        ), 
        list(name = "2.2", 
          children = list(
          list(name = "2.21"), 
          list(name = "2.22") 
         ) 
        ) 
        ) 
      ) 
      ) 
) 

idの私の実際のセットは、(長い6桁まで)はるかに大きいと深いので、私は自動的にこのネストされたリストを作成する方法が必要です。私はこの1つのようないくつかの列内のIDの数字を格納data.frameを作成して開始しました:

df <- data.frame(root = 0, 
       a = c(1, 1, 1, 1, 2, 2, 2, 2, 2, 2), 
       b = c(NA, 1, 2, 3,NA, 1, 1, 2, 2, 2), 
       c = c(NA,NA,NA,NA,NA,NA, 1,NA, 1, 2)) 

しかし、私はさらに任意の私の関心事で取得する方法を考えることはできません。 もっと有望なアプローチはありますか?

答えて

2

ここには、再帰関数に基づく可能な解決策があります。そして、決して速い解決策ではありませんが、あなたのために働くべきです。

library(network3D) 
findChildren <- function(pa, ids) { 
    lapply(ids, function(ch){ 
     if(grepl(paste("^", pa, sep = ""), ch) && ch != pa && 
      nchar(gsub("\\.", "", ch)) == nchar(gsub("\\.", "", pa)) + 1) 
     { 
      childrenTmp = Filter(Negate(is.null), findChildren(ch, ids)) 
      if(length(childrenTmp) != 0) list(name = ch, children = childrenTmp) 
      else list(name = ch) 
     } 
    } 
    ) 
} 

myList <- list(name = "0", 
       children = Filter(
        function(x){nchar(x$name) == 1 },      
        lapply(ids[-1], function(id) { 
         childrenTmp = Filter(Negate(is.null), findChildren(id, ids)) 
         if(length(childrenTmp) != 0) list(name = id, children = childrenTmp) 
         else list(name = id) 
        } 
        ) 
       ) 
       ) 
diagonalNetwork(myList) 

enter image description here

関連する問題