2017-11-23 4 views
0

私はRに慣れていますので、私に同行してください。 私はこのような遅延ロードされたデータフレームのリストを持っている:関数であるサブリストの選択されたメンバーをfor()ループなしでR内の1つのリストにマージする方法はありますか?

dataPath <- "C:\\R_data" 
dataFramesByYear <- 
    lapply(
    list.files(dataPath, "*dataFrame.[2][0-9][0-9][0-9].feather"), 
    function(fileName) { 
     lazyDataFeather(fileName) 
    }) 

私はデータは、()ファイルまたは戻り、以前にロードされたデータとisLoadedをロードのどちらかということの関数であるdataFramesByYear(このような構造になってしまいますブール値):

list(list(data = data(), isLoaded)) 

これらの年単位のデータフレームを1つにまとめたいと思います。私は)(私はこのような何かをしてrbindlistを使用することができます知っている:

framesList <- list(dataFramesByYear[[1]]$data(), dataFramesByYear[[2]]$data(), dataFramesByYear[[3]]$data()) 
combinedData <- 
    as.data.frame(
    rbindlist(
     framesList, 
     use.names = TRUE)) 

は時々年のインデックスが(RStudioは、「範囲外のインデックス」を報告します)しかし、これは動作しません、ベクトルとして供給されています

yearIndexes <- 1:3 
framesList <- dataFramesByYear[[yearIndexes]]$data() 

for()ループを使用せずにframesListを定義する方法はありますか?

+0

「複数」とはどういう意味ですか?データフレームの選択のルールはありますか? – amarchin

+0

@amarchinこの場合、複数のデータフレームは、2つのデータフレームと利用可能なすべてのデータフレームを意味します。インデックスは関数のパラメータでリストとして提供され、連続していますが、必ずしも1から始まらなくてもかまいません。 – Ruutsa

+0

再現可能な例がないと簡単ではありません...とにかく最後のコマンドの「インデックスが範囲外です」エラーこれを行う必要があります: 'framesList < - dataFramesByYear [yearIndexes] $ data()' – amarchin

答えて

1

問題は、あなたがインデックスベクトルのリストを供給しているどのように関連している:あなたはあなたが代わりにframesList <- dataFramesByYear[yearIndexes]$data()を実行する必要があり

l <- list(1, 2, 3, 4, 5) 
ix <- c(1, 3, 4) 
l[ix] 

[[1]] [1] 1

[[2]] [1] 3

[[3]] [1] 4

以下の例のように[[の代わりに[を使用する必要がありますframesList <- dataFramesByYear[[yearIndexes]]$data()

+0

$ data()の部分を除いてほとんど機能しました。 framesList < - dataFramesByYear [yearIndexes] $ data()はエラーを返します:非関数の適用を試みます しかし、あなたの答えは正しい方向に私を指摘しました。 lapply()を追加すると、正しい結果が得られます。 yearIndexes < - 1:3; framesList < - dataFramesByYear [unlist(yearIndexes)]; combinedData < - as.data.frame( rbindlist(lapply ( framesList、 関数(たlistData){たlistData $データ()})、 use.names = TRUE)) – Ruutsa

関連する問題