web-dev-qa-db-ja.com

Rのリストのリストにリストを追加する

既にリスト形式になっているリストにデータを追加する際に問題があります。シミュレーションループ中に結果オブジェクトをエクスポートするプログラムがあります。データ自体は行列のリストとして保存されます。私の考えは、これらのリストをリストに保存し、このリストのリストをRオブジェクトとして保存して後で分析できるようにすることですが、これを正しく達成するためにいくつかの問題があります。シミュレーションからのマトリックスデータの代わりに値を使用して、小さな抽象的な例で行ったことを示します。

シミュレーションループを3回実行したとします。反復中に、結果リストは、Rオブジェクトとして保存するリストの1つのリストに収集する必要があります。

他のリストを含めて保存するリスト:outlist1 <- list()

最初の反復:resultsa <- list(1,2,3,4,5)

outlist <- append(outlist1,resultsa)

2番目の反復:resultsb <- list(6,7,8,9,10)

outlist <- append(outlist1,b)

3番目の反復:resultsc <- list(11,12,13,14,15)

outlist <- list(outlist2,c)

ただし、この方法は、リストを含むリストをこのように成長させても機能しません。望ましい結果は次のとおりです。

>outlist
[[1]]
[[1]][[1]]
[1] 1

[[1]][[2]]
[1] 2

[[1]][[3]]
[1] 3

[[1]][[4]]
[1] 4

[[1]][[5]]
[1] 5


[[2]]
[[2]][[1]]
[1] 6

[[2]][[2]]
[1] 7

[[2]][[3]]
[1] 8

[[2]][[4]]
[1] 9

[[2]][[5]]
[1] 10


[[3]]
[[3]][[1]]
[1] 11

[[3]][[2]]
[1] 12

[[3]][[3]]
[1] 13

[[3]][[4]]
[1] 14

[[3]][[5]]
[1] 15

しかし、代わりに私が得るものは:

> outlist3
[[1]]
[[1]][[1]]
[[1]][[1]][[1]]
[1] 1

[[1]][[1]][[2]]
[1] 2

[[1]][[1]][[3]]
[1] 3

[[1]][[1]][[4]]
[1] 4

[[1]][[1]][[5]]
[1] 5


[[1]][[2]]
[[1]][[2]][[1]]
[1] 6

[[1]][[2]][[2]]
[1] 7

[[1]][[2]][[3]]
[1] 8

[[1]][[2]][[4]]
[1] 9

[[1]][[2]][[5]]
[1] 10

フォーマットされた結果のリストが望ましい結果のようになるように、リストをどのように拡大しますか?これらのリストをさらに分析する場合、要素に簡単にアクセスできる必要があります。

51
Ward9250

これ、あなたが欲しいもの:

# Initial list:
myList <- list()

# Now the new experiments
for(i in 1:3){
  myList[[length(myList)+1]] <- list(sample(1:3))
}

myList
68
Daniel Fischer
outlist <- list(resultsa)
outlist[2] <- list(resultsb)
outlist[3] <- list(resultsc)

appendのヘルプファイルには、ベクター用と書かれています。ただし、ここでは使用できます。以前に試したことがあると思いましたが、OPのコードに奇妙な異常があり、誤解を招く可能性がありました:

outlist <- list(resultsa)
outlist <- append(outlist,list(resultsb))
outlist <- append(outlist,list(resultsc))

同じ結果。

15
42-

リストの最後を過ぎてインデックスに割り当てることを伴う他の2つのソリューションがあります。以下は、appendを使用するソリューションです。

resultsa <- list(1,2,3,4,5)
resultsb <- list(6,7,8,9,10)
resultsc <- list(11,12,13,14,15)

outlist <- list(resultsa)
outlist <- append(outlist, list(resultsb))
outlist <- append(outlist, list(resultsc))

要求された形式を提供します

> str(outlist)
List of 3
 $ :List of 5
  ..$ : num 1
  ..$ : num 2
  ..$ : num 3
  ..$ : num 4
  ..$ : num 5
 $ :List of 5
  ..$ : num 6
  ..$ : num 7
  ..$ : num 8
  ..$ : num 9
  ..$ : num 10
 $ :List of 5
  ..$ : num 11
  ..$ : num 12
  ..$ : num 13
  ..$ : num 14
  ..$ : num 15
10
Brian Diggs

この答えは受け入れられたものと似ていますが、少し複雑ではありません。

L<-list()
for (i in 1:3) {
L<-c(L, list(list(sample(1:3))))
}
7
Eduardo Bergel

リストの割り当てを最初に変数に設定することにより

myVar <- list()

それにより、階層的割り当ての可能性が開かれます

myVar[[1]] <- list()
myVar[[2]] <- list()

など...ので、今それが可能です

myVar[[1]][[1]] <- c(...)
myVar[[1]][[2]] <- c(...)

または

myVar[[1]][['subVar']] <- c(...)

等々

($の代わりに)名前を直接割り当てることもできます

myVar[['nameofsubvar]] <- list()

その後

myVar[['nameofsubvar]][['nameofsubsubvar']] <- c('...')

覚えておくべき重要なことは、システムを動作させるために常に二重括弧を使用することです

情報を取得するのは簡単です

myVar$nameofsubvar$nameofsubsubvar

等々...

例:

a <-list()
a[['test']] <-list()
a[['test']][['subtest']] <- c(1,2,3)
a
$test
$test$subtest
[1] 1 2 3


a[['test']][['sub2test']] <- c(3,4,5)
a
$test
$test$subtest
[1] 1 2 3

$test$sub2test
[1] 3 4 5

r言語の優れた機能は、階層的な定義です...

複雑な実装(2つ以上のレベル)に使用しましたが、動作します!

4
Jesse Burström