1

リスト内にあるデータフレームを操作したいと考えています。現在の最善の努力にもかかわらず、「添え字の数が正しくありません」などのエラーが発生します。これが私のコードです:

folder = 'C:/Path to csv files-071813/'
symbs = c('SPX', 'XLF', 'XLY', 'XLV', 'XLI', 'IYZ', 'XLP', 'XLE', 'XLK', 'XLB', 'XLU', 'SHV')
importData = vector('list', length(symbs))
names(importData) = symbs

for (sIdx in 1:length(symbs)){
    #Import the data for each symbol into the list.
    importData[sIdx] = read.csv(paste(folder, symbs[sIdx], '.csv', sep = ''), header = TRUE)

}

各 csv ファイルは数千行、7 列です。上記の内容は、各csvファイルからリストにデータフレームを返すことだと思います。入力したい内容:

importData[[1]][, 1]

リストの最初のデータ フレームの最初の列を操作します。私は近いですか?すべての検索にもかかわらず、解決策が見つかりません。よろしくお願いします...

4

3 に答える 3

4

関数のapplyファミリーは、ここであなたの友人になるでしょう。具体的lapplyには、リストと関数を指定すると、そのリストのすべての要素に関数を適用し、結果を新しいリストの要素として返す関数です。

folder = 'C:/Path to csv files-071813/'
symbs = c('SPX', 'XLF', 'XLY', 'XLV', 'XLI', 'IYZ', 'XLP', 'XLE', 'XLK', 'XLB', 'XLU', 'SHV')
filenames = paste0(folder,symbs,'.csv')
listOfDataframes=lapply(filenames,read.table,header=T)

すべてのデータフレームから2番目の列が必要な場合は、次のようなことができます

listOfFirstCols=lapply(listOfDataframes,"[",,2)

またはより明示的に

listOfFirstCols=lapply(listOfDataframes,function(x)x[,1])
于 2013-07-18T15:54:42.227 に答える
1

はい、あなたは近くにいます。あなたが必要

importData[[sIdx]] <- read.csv(....)

(つまり)番目のコンポーネント[[データ フレームを割り当てたい場合。単一のブラケットには、リストを割り当てる必要があります。sIdx[

importData[[1]]内のオブジェクトを返しますimportData[1]。これは微妙な違いで、後者は最初のコンポーネントを含むリストを返しますが、前者はそのリスト内のオブジェクトを返します。

データ フレームと同様importData[[sIdx]]に、他のデータ フレームと同じようにインデックスを作成できます。importData[[sIdx]]データフレームと考えてdfから、最初の列にインデックスを付けるために通常使用するもの、つまりdf[, 1](または代わりdf[[1]]に)それに追加してから、代わりに実際のオブジェクトに置き換えると役立つ場合がありますdf

                df[, 1]
importData[[sIdx]][, 1] ## substitute back in the real object for `df`

最初の各列を順番に抽出する場合は、

lapply(importData, `[`, , 1) ## matches df[, 1]

また

lapply(importData, `[[`, 1)  ## matches df[[1]]

可能な場合、結果を配列に単純化するsapply()代わりにバージョンを使用して、それらをリストとして返します。lapply()

最初の例では

lapply(importData, `[`, , 1)

空の引数 ( ) は、 の空の引数、つまりカンマの前のビット, , 1を参照するので重要です。df[ , 1]したがって、呼び出しで使用する 2 番目のオプションは、[[エラーlapply()が発生しにくい可能性があります。

于 2013-07-18T16:10:00.583 に答える
0
>  myfunc<-function(a,b){ ###a is numeric (vector of) symbol indices to
> include,b is (vector of) column indices to include
>        if (length(a)>0){
>           importalldata<-read.csv(paste(folder, symbs[a[1]], '.csv', sep = ''), header = TRUE)[b]
>        if (length(a)>1){
>           for(i in 2:length(d)){
>              importalldata<-rbind(importalldata,read.csv(paste(folder, symbs[a[i]], '.csv', sep = ''), header = TRUE)[b])
>           }
>        }else{print('Must select at least one symbol')}
>     return(importalldata)
>     }

1 つのシンボルのデータをロードするには、次のようにします。

importalldata<-myfunc(1,1)

複数のシンボルの場合:

importalldata<-myfunc(c(1,3,4),1)

複数の列の場合:

importalldata<-myfunc(c(1,3,4),1:3)

私はそれがあなたが望むものだと思いますか?または、各ファイルのすべての列 1 を 1 つのデータフレームに取得しようとしていますか? 再現可能なデータを含めると、より良い答えが得られます。

とは言っても、数千行はそれほど多くないため、データを 1 つの csv に結合 (「スタック」) し、symbls を要因として使用し、subset/data.table パッケージを使用してデータを選択する方がよいでしょう。欲しいです。チェックアウト

?stack
于 2013-07-18T18:30:30.243 に答える