8

出力がリストである関数を作成しました。関数をループに入れたいのですが、各反復 (もちろんリスト) の出力をより大きなリストに格納したいと考えています。つまり、この BIG リストの各要素もリストです。c() は私が望むことをしません。それを行う方法はありますか?

私が求めていることをよりよく理解するために、以下の例を検討してください。

iter1 <- list(item1 = 1, item2 = "a")
iter2 <- list(item1 = 1, item2 = "b")
All <- list(iter1 = iter1, iter2 = iter2)

上記のコードと同様のことをループで実行できるようにしたいと考えています。どうやってやるの?

ご協力いただきありがとうございます、

4

4 に答える 4

9

を使用して、リストに割り当てる別の方法がありmy_list[[name or number]] <-ます。本当にループでそれを行いたい場合は、iter1、iter2、... などの名前を持つものをループするだけです

A <- list()
n_iter <- 2
for (i in 1:n_iter){
    iname <- paste("iter",i,sep="")
    A[[iname]] <- get(iname)
}

@mnel が指摘したように、リストを動的に拡張することは非効率的です。別の方法は、次を使用することだと思いますlapply

n_iter <- 2
inames <- paste("iter",1:n_iter,sep="")
names(inames) <- inames
A <- lapply(inames,get)

これは、サブリストに常に 2 つの要素があり、それぞれが一貫したクラス (項目 1 は数値、項目 2 は文字) を持つ場合は、データ フレームでも実行できます。

n_iter <- 2
DF <- data.frame(item1=rep(0,n_iter),item2=rep("",n_iter),stringsAsFactors=FALSE)
for (i in 1:n_iter){
     iname <- paste("iter",i,sep="")
     DF[i,] <- get(iname)
     rownames(DF)[i] <- iname
}

#       item1 item2
# iter1     1     a
# iter2     1     b

ただし、これは非常に見苦しい方法です。を使用すると、物事はすぐに混乱しgetます。データ構造を使用して、ループ内で iter1 と iter2 を作成し、それらをすぐに親リストまたはデータ フレームに埋め込みたいと思いませんか?

n_iter = 10
DF <- data.frame(item1 = rep(0,n_iter), item2 = rep("",n_iter))
for (i in 1:n_iter){
    ... do stuff to make anum and achar ...
    DF[i,"item1"] <- anum
    DF[i,"item2"] <- achar
}

anum と achar は、その反復から格納する item1 と item2 の値です。SOdata.tableの他の場所では、この種のデータフレーム割り当てのほぼ 10 倍の速度/効率のパッケージを使用する代替手段があると彼らは言います。

ああ、最後のアイデア: それらを最初にリストに入れたい場合は、後で簡単にデータ フレームに変換できます。

DF <- do.call(rbind.data.frame,A)
于 2013-05-17T05:52:19.570 に答える
5

これにより、All

c(iter1=list(iter1), iter2=list(iter2))

> identical(c(iter1=list(iter1), iter2=list(iter2)), All)
[1] TRUE

に 3 番目のリストを追加するとしますAll

c(All, list(iter3=iter3))

リスト名を気にしなければ、少しきれいに見えます

 c(list(iter1), list(iter2))
于 2013-05-17T06:33:34.823 に答える
1

ここでは@Frankの答えが正しいと思いますが、彼が示した最初の例は少し奇妙に思えました。これをやりたいと思う...

bigLL <- list()
for( i in 1:3 ){

  ll <- list( item1 = i , item2 = letters[i] )
  bigLL[[i]] <- ll

}

bigLL
#[[1]]
#[[1]]$item1
#[1] 1

#[[1]]$item2
#[1] "a"


#[[2]]
#[[2]]$item1
#[1] 2

#[[2]]$item2
#[1] "b"


#[[3]]
#[[3]]$item1
#[1] 3

#[[3]]$item2
#[1] "c"

ただし、可能であれば、フランクによる代替案を検討する必要があります。

于 2013-05-17T09:27:43.533 に答える