web-dev-qa-db-ja.com

リスト要素としてのデータフレームの追加(forループを使用)

私の環境には、EOGと呼ばれる一連のデータフレームがあります。 2006年から2012年の間に毎年1つあります。EOG2006、EOG2007 ... EOG2012のように。それらをリストの要素として追加したいと思います。

最初に、これが可能かどうかを確認しようとしています。私は公式のRガイドといくつかのRプログラミングマニュアルを読みましたが、それに関する明確な例は見つかりませんでした。

次に、forループを使用してこれを実行します。残念ながら、私が仕事をするために使用したコードは間違っており、私はそれを修正することに夢中になっています。

for (j in 2006:2012){
z<-j
sEOG<-paste("EOG", z, sep="")
dEOG<-get(paste("EOG", z, sep=""))
lsEOG<-list()
lsEOG[[sEOG]]<-dEOG
}

これは、1つの要素を持つリストを返します。間違いはどこですか?

13
Riccardo

ループ内でリストを再初期化し続けます。 lsEOG<-list()forループの外に移動する必要があります。

lsEOG<-list()

for (j in 2006:2012){
  z <- j
  sEOG <- paste("EOG", z, sep="")
  dEOG <- get(paste("EOG", z, sep=""))
  lsEOG[[sEOG]] <-dEOG
}

また、j関数で直接pasteを使用できます。

sEOG <- paste("EOG", j, sep="")
20

私も同じ質問をしましたが、OPの最初のコードはR初心者には少し不透明だと感じました。だから、ここではおそらくループでデータフレームを作成し、それらをリストに追加する方法の少し明確な例を示します。リストに追加したのは、Rシェルで遊んでみたところです。

 > dfList <- list()  ## create empty list
 >
 > for ( i in 1:5 ) {
 +     x <- rnorm( 4 )
 +     y <- sin( x )
 +     dfList[[i]] <- data.frame( x, y )  ## create and add new data frame
 + }
 >
 > length( dfList )  ## 5 data frames in list
 [1] 5
 >
 > dfList[[1]]    ## print 1st data frame
            x          y
 1 -0.3782376 -0.3692832
 2 -1.3581489 -0.9774756
 3  1.2175467  0.9382535
 4 -0.7544750 -0.6849062
 >
 > dfList[[2]]    ## print 2nd data frame
            x          y
 1 -0.1211670 -0.1208707
 2 -1.5318212 -0.9992406
 3  0.8790863  0.7701564
 4  1.4014124  0.9856888
 >
 > dfList[[2]][4,2]   ## in 2nd data frame, print element in row 4 column 2
 [1] 0.9856888
 >

私のようなR初心者の場合、i番目のデータフレームにアクセスするには二重括弧が必要であることに注意してください。基本的に、リストには二重括弧が使用され、ベクトルには単一括弧が使用されます。

12
RickC

データフレームがオブジェクトとして保存されている場合は、apropos("EOG", ignore.case=FALSE)を使用してデータフレームを検索し、ループでそれらをリストに保存できます。

list.EOG<- apropos("EOG", ignore.case=FALSE) #Find the objects with case sensitive 
lsEOG<-NULL #Creates the object to full fill in the list
for (j in 1:length(list.EOG)){
lsEOG[i]<-get(list.EOG[i]) #Add the data.frame to each element of the list
}

使用できるリストにそれぞれの名前を追加するには:

names(lsEOG, "names")<-list.EOG
0
llrs