1

Rにデータフレームがあり、「factor1」と「factor2」の2列を因子として使用し、上記の因子の各ペアごとに他のすべての列の平均値を計算する必要があるとします。以下のコードを実行すると、最後の行で次の警告が表示されます。

Warning messages:
1: In split.default(seq_along(x), f, drop = drop, ...) :
  data length is not a multiple of split variable

...

なぜそれが起こっているのですか?それを正しくするにはどうすればよいですか? ありがとう。

これが私のコードです:

# Create data frame
myDataFrame <- data.frame(factor1=c(1,1,1,2,2,2,3,3,3), factor2=c(3,3,3,4,4,4,5,5,5), val1=c(1,2,3,4,5,6,7,8,9), val2=c(9,8,7,6,5,4,3,2,1))  

# Split by 2 columns (factors)
splitDataFrame <- split(myDataFrame, list(myDataFrame$factor1, mydataFrame$factor2))

# Calculate mean value for each column per each pair of factors
splitMeanValues <- lapply(splitDataFrame, function(x) apply(x, 2, mean))

# Combine back to reduced table whereas there is only one value (mean) per each pair of factors
MeanValues <- unsplit(splitMeanValues, list(unique(myDataFrame$factor1), unique(mydataFrame$factor2)))

EDIT1: データ フレームの作成を追加 (上記参照)

4

3 に答える 3

1

因子以外のすべての列の平均を計算する必要がある場合は、次の数式構文を使用できます。aggregate()

aggregate(.~factor1+factor2, myDataFrame, FUN=mean)

それが返ってくる

  factor1 factor2 val1 val2
1       1       3    2    8
2       2       4    5    5
3       3       5    8    2

データを分割するときと同じ数の行が必要split()な場合、この方法は機能しませんでした。unsplitすべてのグループの行数を 1 行に減らしていました。さらに、実際には、グループの順序が乱れる可能性があるためunsplit、使用したのとまったく同じ要素のリストで使用する必要があります。本当に必要な場合は、折りたたみ関数を作成してから、リストを単一の data.frame に戻すことができますが、単純な意味でsplitは、おそらく最適です。splitlapplyrbindaggregate

于 2014-06-19T04:19:58.457 に答える
0

試しましたaggregateか?

aggregate(myDataFrame$valueColum, myDataFrame$factor1, FUN=mean) aggregate(myDataFrame$valueColum, myDataFrame$factor2, FUN=mean)

于 2014-06-19T03:42:01.643 に答える