相互リンクされたリストをツリーとして再帰的に表示names
する (組み込みの/簡単な) 方法はありますか? tree
(シェル コマンドと同様の出力が表示される可能性があります。)
たとえば、リスト X では、2 つの列 A と B があり、A は 2 つのサブ列 a1 と a2 で構成されています
nametree(x)
X
├── A
│ ├── a1
│ └── a2
└── B
names(X)
表示するだけです[1] "A" "B"
相互リンクされたリストをツリーとして再帰的に表示names
する (組み込みの/簡単な) 方法はありますか? tree
(シェル コマンドと同様の出力が表示される可能性があります。)
たとえば、リスト X では、2 つの列 A と B があり、A は 2 つのサブ列 a1 と a2 で構成されています
nametree(x)
X
├── A
│ ├── a1
│ └── a2
└── B
names(X)
表示するだけです[1] "A" "B"
再帰的な解決策は次のとおりです。
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
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"
簡単な例:
> 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 ...