7

製品プロトタイプのテスト データを含むデータ セットがあります。すべてのテストがすべてのロットで実行されたわけではなく、すべてのテストが同じサンプル サイズで実行されたわけではありません。説明のために、次のケースを考えてみましょう。

> 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()場合の出力としてvarNnameNA
  • ~mean()の実際の値が 1 つ以上ある場合の出力varNname

これはかなり簡単だと思いますが、方法がわかりません。このようなものに使用する必要があり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

4

1 に答える 1