2016-08-09 8 views
-2

グループごとに平均とsdをグループ別に計算したいR私のデータは以下の通りです:グループ別頻度平均

  Opinion 1 2 3 4 5 6 7 8 9 10 11 
     Group 
     A   0 1 1 0 3 15 8 9 12 5 3 
     B   1 3 5 8 15 18 17 14 15 9 4 
     C   8 4 15 19 14 25 17 16 20 4 6 
     D   0 0 0 0 0 0 1 0 0 0 0 
     E   0 6 5 8 12 14 15 15 14 7 8 
     F   1 0 0 0 1 1 0 1 1 0 0 
     G   3 0 4 4 1 1 1 1 1 0 1 

私が計算したいのは、すべてのグループ(A、B、C、D、F、G)の平均とsdです。すべてのセルは周波数です。特に、それは回答者から受け取ったすべての「意見」の回答の数です。例えば、グループAの支持者である回答者は、平均回答7.5とsd 1.9を得ています。

私はすべてのグループの平均とsdで計算します。これを一度に計算できるループを書く方法は?私はここに誰かがすでにそれを知っていると確信しています。私は本当にあなたの助けに感謝します。ありがとうございました。

P.S. apply()は、平均と周波数のsdが必要なため動作しません。

次のコードを使用することができ、各グループの平均値の計算のため
+0

'(データ1、平均)を適用 'と'行別名(データ1、SD) '、一次元のトラバーサルのために1つのスタンドを、適用からループを使用しました。 – FisherDisinformation

+0

[rは行ごとにn個の列を取得する]の重複の可能性があります(http:// stackoverflow。com/questions/31683217/r-get-mean-of-row-by-row) – dash2

+0

@ dash2それは簡単ではありません。行内の値の位置は、ここで決定的な役割を果たす。したがって 'rowMeans'または' apply(data、1、mean) 'は正しい結果を与えません。 – RHertel

答えて

1

the_means <- setNames(rowSums(col(df1)*df1)/rowSums(df1), 
         LETTERS[seq_len(nrow(df1))]) 
#> the_means 
#  A  B  C  D  E  F  G 
#7.526316 6.761468 6.013514 7.000000 6.846154 5.800000 4.529412 

データ:手段については

df1 <- structure(list(V1 = c(0L, 1L, 8L, 0L, 0L, 1L, 3L), V2 = c(1L, 3L, 
4L, 0L, 6L, 0L, 0L), V3 = c(1L, 5L, 15L, 0L, 5L, 0L, 4L), V4 = c(0L, 8L, 
19L, 0L, 8L, 0L, 4L), V5 = c(3L, 15L, 14L, 0L, 12L, 1L, 1L), V6 = c(15L, 
18L, 25L, 0L, 14L, 1L, 1L), V7 = c(8L, 17L, 17L, 1L, 15L, 0L, 1L), 
V8 = c(9L, 14L, 16L, 0L, 15L, 1L, 1L), V9 = c(12L, 15L, 20L, 0L, 14L, 1L, 
1L), V10 = c(5L, 9L, 4L, 0L, 7L, 0L, 0L), V11 = c(3L, 4L, 6L, 0L, 8L, 0L, 
1L)), .Names = c("V1", "V2", "V3", "V4", "V5", "V6", "V7", "V8", "V9", 
"V10", "V11"), class = "data.frame", row.names = c(NA, -7L)) 
+0

質問の第2部分に答える予定がありましたか? – Frank

+0

@Frank私は試みましたが、私は優雅な解決策を見つけることができなかったので、しばらくしてから諦めました。あなたが持っているなら、先に進んでください... – RHertel

+0

いいえ、rowMeansとrowSdsのような名前の関数を持つパッケージをインストールする以外に何もない、あるいは 'lapply(split(m、row(m))、summary)'のような、 。ああ、決して上記のあなたのコメントと実際の質問を読んで気にする必要はありません。 – Frank

1

(RHertelの素敵な、再現性のあるデータ@使用)

apply(df1, 1, function(x) weighted.mean(1:11, w = x)) 
# [1] 7.526316 6.761468 6.013514 7.000000 6.846154 5.800000 4.529412 

標準偏差:

apply(df1, 1, function(x) sqrt(weighted.mean((1:11)^2, w = x) - weighted.mean(1:11, w = x)^2)) 
# [1] 1.883495 2.254045 2.552123 0.000000 2.448584 2.785678 2.767833 

Var(X) = E(X^2) - E(X)^2の定義を使用し、標準偏差の平方根を取っています。サンプル標準偏差が必要な場合は、sqrt(rowSums(df1)/(rowSums(df1) - 1))を掛けることができます。もちろん、グループDについては、1回の観察でNAまたはNaNとなります。

これをより一般的なものにするには、as.numeric(colnames(df1))などの適切なものを1:11ビットに置き換えることができます。おそらくtableのデータ構造を知るのは難しいでしょうか?

+0

ニース!より一般的な方法は '1:11'を' seq_len(ncol(df1)) 'に置き換えることです。 – RHertel

+0

私は懐疑的です。それはdata.frameです。私の推測はテーブルオブジェクトです。そして、私は非連続的な非開始列(例えば、 'df1 = table(am = mtcars $ am、cyl = mtcars $)の場合でも動作するはずだから、' as.numeric Cyl))。また、これらの調整をエンドユーザーに任せても大丈夫です。 – Gregor

+0

フェア十分! :) – RHertel

1

解決策も投稿したいと思います。私が何をしたか

は次のとおりです。

  1. はベクトル(そうでないRは私がapply()を使用した場合、私はなるだろう何を示す保持)までの周波数からdata.frame()

    b1 <- data.frame(table(data$Group, as.numeric(data$Opinion))) 
    
  2. table()から拡張データを作成しました

    b2 <- b[rep(row.names(b), b$Freq), 1:2] 
    
  3. ddply()

    b3 <- ddply(b2, .(Var1), summarize, mean = mean(as.numeric(Var2), na.rm = TRUE), sd = sd(Var2))