製品プロトタイプのテスト データを含むデータ セットがあります。すべてのテストがすべてのロットで実行されたわけではなく、すべてのテストが同じサンプル サイズで実行されたわけではありません。説明のために、次のケースを考えてみましょう。
> test <- data.frame(name = rep(c("A", "B", "C"), each = 4),
var1 = rep(c(1:3, NA), 3),
var2 = 1:12,
var3 = c(rep(NA, 4), 1:8))
> test
name var1 var2 var3
1 A 1 1 NA
2 A 2 2 NA
3 A 3 3 NA
4 A NA 4 NA
5 B 1 5 1
6 B 2 6 2
7 B 3 7 3
8 B NA 8 4
9 C 1 9 5
10 C 2 10 6
11 C 3 11 7
12 C NA 12 8
以前は、不一致の繰り返しのケースに対処するだけで済みましたが、これはaggregate(cbind(var1, var2) ~ name, test, FUN = mean, na.action = na.omit)
(またはデフォルト設定で) 簡単でした。var1
の 3 つの値と の 4 つの値を超える各ロットの平均を取得しますvar2
。
残念ながら、このA
場合、データセットが完全に欠落したままになります。
aggregate(cbind(var1, var2, var3) ~ name, test, FUN = mean, na.action = na.omit)
name var1 var2 var3
1 B 2 6 2
2 C 2 10 6
ただし、を使用するna.pass
と、必要なものも得られません。
aggregate(cbind(var1, var2, var3) ~ name, test, FUN = mean, na.action = na.pass)
name var1 var2 var3
1 A NA 2.5 NA
2 B NA 6.5 2.5
3 C NA 10.5 6.5
var1
のインスタンスが含まれていたため、保持していた適切なデータが失われましたNA
。
私が欲しいのは:
NA
~のすべての一意の組み合わせがsであるmean()
場合の出力としてvarN
name
NA
- ~
mean()
の実際の値が 1 つ以上ある場合の出力varN
name
これはかなり簡単だと思いますが、方法がわかりません。このようなものに使用する必要がありddply
ますか?もしそうなら...私がそれを避ける傾向がある理由は、私がそうするために非常に長い等価物を書くことにaggregate()
なるからです:
ddply(test, .(name), summarise,
var1 = mean(var1, na.rm = T),
var2 = mean(var2, na.rm = T),
var3 = mean(var3, na.rm = T))
ええ...その結果は明らかに私が望むことをします。1) でこれを行う方法、aggregate()
または 2) の短い構文がある場合に備えて、とにかく質問を残しますddply
。