8

相互リンクされたリストをツリーとして再帰的に表示namesする (組み込みの/簡単な) 方法はありますか? tree(シェル コマンドと同様の出力が表示される可能性があります。)

たとえば、リスト X では、2 つの列 A と B があり、A は 2 つのサブ列 a1 と a2 で構成されています

nametree(x)
X
├── A
│   ├── a1
│   └── a2
└── B

names(X)表示するだけです[1] "A" "B"

4

4 に答える 4

9

再帰的な解決策は次のとおりです。

nametree <- function(X, prefix = "")
  if( is.list(X) )
    for( i in seq_along(X) ) { 
      cat( prefix, names(X)[i], "\n", sep="" )
      nametree(X[[i]], paste0(prefix, "  "))
    }
X <- list(X = list( A = list( a1=1:10, a2=1:10 ), B = 1:10 ))
nametree(X)
# X
#   A
#     a1
#     a2
#   B

スペースではなくブランチを使用してツリー構造を表示するのは、少しトリッキーです。

nametree <- function(X, prefix1 = "", prefix2 = "", prefix3 = "", prefix4 = "")
  if( is.list(X) )
    for( i in seq_along(X) ) { 
      cat( if(i<length(X)) prefix1 else prefix3, names(X)[i], "\n", sep="" )
      prefix <- if( i<length(X) ) prefix2 else prefix4
      nametree(
        X[[i]], 
        paste0(prefix, "├──"),
        paste0(prefix, "│  "),
        paste0(prefix, "└──"),
        paste0(prefix, "   ")
      )
    }
nametree(X)
# X
# +--A
# ¦  +--a1
# ¦  +--a2
# +--B
# +--C
#    +--a
#    +--b
于 2013-08-08T10:22:22.683 に答える
4

data.tree パッケージを使用できます。例えば:

x <- list( A = list( a1 = list(data = 1:10), b1 = list(data = 1:100 )), B = list(data = c(1, 3, 5) ))
library(data.tree)
xtree <- FromListSimple(x, nodeName = "X")
xtree

これは出力します:

   levelName
1 X         
2  ¦--A     
3  ¦   ¦--a1
4  ¦   °--b1
5  °--B  

または、データを印刷可能な形式に変換できます。

print(xtree, maxData = function(node) if (is.null(node$data)) 0 else max(node$data))

これは次を示しています。

   levelName maxData
1 X                0
2  ¦--A            0
3  ¦   ¦--a1      10
4  ¦   °--b1     100
5  °--B            5

最後に、ノードの名前を表示するには:

names(xtree$children)

これは以下を出力します:

[1] "A" "B"
于 2016-05-14T13:00:45.590 に答える
4

簡単な例:

> mylist <- list(A=data.frame(A1=1:3,A2=4:6),B=7:9)
> out <- lapply(mylist,names)
$A
[1] "A1" "A2"

$B
NULL

これは、リストの1レベル下にデータフレームしかないことを前提としています...したがって、それ自体は再帰的ではありませんが、これはデータ構造に似ているように聞こえます。

DrMike と Henrik の使用str(mylist)する提案は再帰的であり、実際、構造の深さと出力の表示の両方を制御できます。

SimonO101 の再帰の例:

> df <- data.frame( A = runif(3) , B = runif(3) )
> ll <- list( A = df , B = list( C = df , D = df ) , E = 1 )
> str(ll)
List of 3
 $ A:'data.frame':      3 obs. of  2 variables:
  ..$ A: num [1:3] 0.948 0.356 0.467
  ..$ B: num [1:3] 0.2319 0.7574 0.0312
 $ B:List of 2
  ..$ C:'data.frame':   3 obs. of  2 variables:
  .. ..$ A: num [1:3] 0.948 0.356 0.467
  .. ..$ B: num [1:3] 0.2319 0.7574 0.0312
  ..$ D:'data.frame':   3 obs. of  2 variables:
  .. ..$ A: num [1:3] 0.948 0.356 0.467
  .. ..$ B: num [1:3] 0.2319 0.7574 0.0312
 $ E: num 1

出力の例:

> str(mylist)
List of 2
 $ A:'data.frame':      3 obs. of  2 variables:
  ..$ A1: int [1:3] 1 2 3
  ..$ A2: int [1:3] 4 5 6
 $ B: int [1:3] 7 8 9

> str(mylist, give.attr=FALSE, give.length=FALSE, give.head=FALSE, vec.len=0, 
indent.str="|", comp.str="----")
List of 2
|----A:'data.frame':    3 obs. of  2 variables:
| ..$ A1:NULL ...
| ..$ A2:NULL ...
|----B:NULL ...
于 2013-08-08T09:55:11.040 に答える