2013-07-19 3 views
6

私は製品プロトタイプテストデータを含むデータセットを持っています。すべてのテストがすべてのロットで実行されたわけではなく、すべてのテストが同じサンプルサイズで実行されたわけではありません。説明するために、この場合は考慮してください。過去には集計を使用したna.omitとna.passのブレンド?

> 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つの値とvar2の4つの値の各ロットの平均を取得します。

残念ながら、これは、この場合には完全に欠落したデータセットたくさんAで私を残す:私はna.passを使用する場合は、しかし、私はまた私が欲しいものを得ることはありません

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 

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のインスタンスが含まれていたので、良いデータが失われました。

私がしたいことはある:1つの以上の実際の値が存在する場合〜namemean()NA

  • 出力されvarNmean()場合、すべてのユニークな組み合わせの出力として

    • NAvarNname

    私はこれが前提であると推測していますttyシンプルですが、私はちょうど方法を知らない。このようなことに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の短い構文がある場合は、私はとにかく質問を残します。

  • +0

    1つの回答が再発しました。 'ddply' [こちら](http://stackoverflow.com/questions/10787640/r-ddply-summarize-with-large-number-of-columns)基本的に、データフレームを溶かし、関心のある変数と元の列名の組み合わせに基づいて 'mean()'を適用し、それを元の形に戻します。他のもの? – Hendy

    答えて

    16

    合格na.action=na.passおよびna.rm=TRUE~aggregate。前者は、NAsが存在する行を削除しないようにaggregateに指示します。後者はmeanに無視するように指示します。

    aggregate(cbind(var1, var2, var3) ~ name, test, mean, 
          na.action=na.pass, na.rm=TRUE) 
    
    +0

    恐ろしく、私は考えられませんでした。 – Hendy

    +0

    @HongOoiこれは素晴らしい仕事。注意すべき点は、選択した機能に応じてNAsをゼロに置き換えます。これはあなたが望む最終結果ではない可能性が高いので、 'df [df == 0] < - NA'のようなものを確認してください。上記のコードを 'is.na(df)'と組み合わせると、 –

    +0

    は、名前 'A'に対して' NA'ではなく 'NaN'を返します。 'var3' – colin

    関連する問題