2

いくつかの data.frames のリストがあります。各 data.frame にはいくつかの列があります。を使用 mean(mylist$first_dataframe$a することで、この 1 つの data.frame で a の平均を取得できます。ただし、リストに保存されているすべての data.frames を計算する方法や、特定の data.frames を計算する方法がわかりません。

ループを使用できましたが apply()、そのバリエーションの方が優れていると言われました。検索で見つけたいくつかのソリューションを使用してみましたが、どういうわけかうまくいきません。使用する必要があると思います

unlist()

私のようなデータ構造の平均などを計算する方法の例を教えてください。複数の列を含む複数の data.frames のリスト。

更新: 混乱して申し訳ありません。すべてのデータフレームの特定の列の総平均が必要でした。すべてのデータフレームの特定の列の総平均を計算するための実用的なソリューションを提供してくれた Thomas と、すべてのデータフレームのすべての列の平均を計算するための便利なソリューションを提供してくれた Psychometriko に感謝します (数値データが含まれていない場合でも)。 .

ありがとう!

4

2 に答える 2

4

これはあなたが探しているものですか?

set.seed(42)
mylist <- list(a=data.frame(foo=rnorm(10),
                            bar=rnorm(10)),
               b=data.frame(foo=rnorm(10),
                            bar=rnorm(10)),
               c=data.frame(foo=rnorm(10),
                            bar=rnorm(10)))
sapply(do.call("rbind",mylist),mean)

       foo        bar 
 0.1163340 -0.1696556 

注:上記の関数でdo.call("rbind",mylist)参照したものに似たものを返し、Rolandの回答で参照されているように、上記の関数の結果であるdata.frameの各コンポーネント(列)で関数を呼び出すだけです。unlistsapplymeando.call

編集: 数値以外の data.frame コンポーネントをどのように処理するかという質問への回答として、以下のソリューションは確かにあまりエレガントではなく、より良いソリューションが存在すると確信していますが、最初に考えられたのは次のとおりです。

set.seed(42)
mylist <- list(a=data.frame(rand=rnorm(10),
                            lets=sample(LETTERS,10,replace=TRUE)),
               b=data.frame(rand=rnorm(10),
                            lets=sample(LETTERS,10,replace=TRUE)),
               c=data.frame(rand=rnorm(10),
                            lets=sample(LETTERS,10,replace=TRUE)))
sapply(do.call("rbind",mylist),function(x) {
  if (is.numeric(x)) mean(x)
})

$rand
[1] -0.02470602

$lets
NULL

これは基本的に、各コンポーネントが数値であるかどうかを最初にテストし、数値である場合は平均を返すカスタム関数を作成するだけです。そうでない場合はスキップします。

于 2013-06-17T11:49:08.307 に答える
2

全体do.call('rbind', List)が非常に遅くなり、事故が発生しやすくなります。平均が必要な列が 1 つしかない場合、最善の方法は次のとおりです。

mean(sapply(mylist, function(X) X$rand))

do.callメソッドの約 10 倍高速です。

于 2013-06-19T20:43:49.337 に答える