1

R 内ffdfで、大規模なデータセットを操作するために使用しています。パッケージから使用ffdfdplyffbaseて、特定の変数 (var) に従ってデータを分割し、var の一意の値を持つすべての観測値のいくつかの特性を計算します (たとえば、var の一意の値ごとの観測数)。これが可能かどうかを確認するためffdfdplyに、以下で説明する例を実行しました。

Petal.Width私は、種ごとに分割し、それぞれの最小値を計算してSpeciesから、2 つの列を返し、それぞれに 3 つのエントリをリストし、Speciesその最小値Petal.Widthをリストすることを期待していましたSpecies。期待される出力:

  Species    min_pw
1 setosa     0.1       
2 versicolor 1.0       
3 virginica  1.4  

ただしBATCHBYTES=5000、1 つは 2 つの Species を含み、もう 1 つは 1 つの Species を含む 2 つの分割を使用します。これにより、次の結果が得られます。

  Species   min_pw
1 setosa    0.1      
2 virginica 1.4    

BATCHBYTES2000に変更すると、強制的ffdfdplyに 3 つの分割が使用されるため、上記の期待される出力が得られます。ただし、「分割」に割り当てられた変数の一意の値ごとに分割を強制する別の方法が必要です。これを実現する方法はありますか?または、必要な結果を得るために他に何か提案はありますか?

ffiris <- as.ffdf(iris)
result <- ffdfdply(x = ffiris,
                   split = ffiris$Species,
                   FUN = function(x) {
                      min_pw <- min(x$Petal.Width)
                      data.frame(Species=x$Species, min_pw= min_pw)
                   },
                   BATCHBYTES = 5000,
                   trace=TRUE
)
dim(result)
dim(iris)
result
4

1 に答える 1

5

関数 ffdfdply は、多くの分割要素がある場合に設計されました。たとえば、1000000 人の顧客がいて、メモリ内のデータを少なくとも顧客ごとに分割したいが、RAM が許可する場合はより多くの顧客を内部で実行する必要がない場合などです。 ffwhich 1000000 回。そのため、ffdfdply のドキュメントには次のように記載されています。

FUN が適用されるデータの 1 つのチャンクに複数の分割要素が含まれる可能性があるという事実を FUN がカバーしていることを確認してください。したがって、問題の解決策は、これを FUN でカバーすることです。つまり、次のようにします。

FUN=function(x){
  require(doBy)
  summaryBy(Petal.Width ~ Species, data=x, keep.names=TRUE, FUN=min)
}
于 2012-07-06T10:35:54.970 に答える