0

大きなデータ フレームのサブセットの各列について、グループごとに平均と標準偏差を計算したいと考えています。

同様の質問に対する回答の一部がうまくいかない理由を理解しようとしています。私はまだ R にかなり慣れていないので、微妙な点がたくさんあると確信しています (そしてそれほど微妙ではないこともあります!) 私は完全に欠けています。

次のような大きなデータ フレームがあります。

mydata <- data.frame(Experiment = rep(c("E1", "E2", "E3", "E4"), each = 9), 
                     Treatment = c(rep(c("A", "B", "C"), each = 3), rep(c("A", "C", "D"), each = 3), rep(c("A", "D", "E"), each = 3), rep(c("A", "B", "D"), each = 3)), 
                     Day1 = sample(1:100, 36), 
                     Day2 = sample(1:100, 36),
                     Day3 = sample(1:150, 36),
                     Day4 = sample(50:150, 36))

たとえば、実験と治療によってデータをサブセット化する必要があります。

testB <- mydata[(mydata[, "Experiment"] %in% c("E1", "E4")) 
            & mydata[, "Treatment"] %in% c("A", "B"), 
            c("Treatment", "Day1", "Day2", "Day4")]

次に、testB の各列について、各治療グループの平均と標準偏差を計算します。

私はまず、tapply を使用しようとしましたが (最初は 1 つの列だけで)、testB にあってはならない処理グループに対して "NA" が返されました。これは、この小さなデータセットでは大きな問題ではありませんが、かなり厄介です。私の実際のデータで:

>tapply(testB$Day1, testB$Treatment, mean)
   A        B        C        D        E 
70.66667 61.00000       NA       NA       NA 

data.frame の複数の変数に対して、グループごとに平均と標準偏差を計算するからのソリューションを実装してみました。集計を使用するとうまくいきました:

ag <- aggregate(. ~ Treatment, testB, function(x) c(mean = mean(x), sd = sd(x)))

しかし、data.table ソリューションを機能させることができません。

library(data.table)
testB[, sapply(.SD, function(x) list(mean=mean(x), sd=sd(x))), by = Treatment]
testB[, c(mean = lapply(.SD, mean), sd = lapply(.SD, sd)), by = Treatment]

どちらもエラーメッセージを表示しました

Error in `[.data.frame`(testB, , c(mean = lapply(.SD, mean), sd = lapply(.SD,  : 
unused argument(s) (by = Treatment)

私は何を間違っていますか?

無知な初心者を助けてくれてありがとう!

4

2 に答える 2

0

あなたの列は要因です。サブセット testB で "C"、"D"、および "E" という処理を含む行を削除しましたが、それらのレベルはまだ存在しています。それらを表示するには、levels(testB) を使用します。testB サブセットを定義するときに関数 droplevels を使用すると、空の因子レベルの NA を返さずに A と B の平均を取得できます。

testB <- droplevels(mydata[(mydata[, "Experiment"] %in% c("E1", "E4")) 
        & mydata[, "Treatment"] %in% c("A", "B"), 
        c("Treatment", "Day1", "Day2", "Day4")]
tapply(testB$Day1,testB$Treatment,mean)
   A        B 
59.16667 66.00000 

お役に立てれば!

ロン

于 2013-05-06T21:53:40.573 に答える