2012-03-13 11 views
3

これは本当に簡単な質問ですが、余分な行の不要なコードを避ける手助けをしてくれることを願っています。列を掛け合わせるときにNAsを削除する

Df.1 <- data.frame(A = c(5,4,7,6,8,4),B = (c(1,5,2,4,9,1)),C=(c(2,3,NA,5,NA,9))) 

私がやりたいことは、私は、元のデータフレームにCBINDますA、BおよびCの乗算であり、余分な列を生成している:私は、単純なデータフレームを持っています。

だから、私は正常に使用します。

attach(Df.1) 
D<-A*B*C 

しかし、NASは、列Cのどこにいるかは明らかに、私はむしろちょうど、私はすべてのNAの行を除外したくない変数DのNAを取得この列のNA値を無視します(Dの値は単にAとBの乗算、またはCが利用可能なA * B * Cの値になります)。

私は単純にNAsを1計算が変わらないか、またはif文を使うのですが、私は単純化した方法でこれを行うのを邪魔していましたか?

アイデア?

+0

どう 'D <について - ' if'を使用して周りに卑劣な方法です* B型*(!C * is.na(C)+ 1 * is.na(C)) '、。 –

+0

それは素晴らしいですが、私は恐れている@CarlWitthoftそのコード行は動作しません。 –

+0

私の謝罪 - 私は今テスト/デバッグできません。どのようなエラー(または出力不良)が発生したのか教えていただけますか? –

答えて

3

na.rm引数を持つprodを使用できます。行使用applyことによってそれを行うには:

apply(Df.1,1,prod,na.rm=TRUE) 
[1] 10 60 14 120 72 36 
+0

これは本当に面白い@ジェームス、私は以前に 'プロード'を使用したことがない - 私は '1'が使用されているか尋ねることができますか?また、私のデータセットに他の列があっても、複数のA、B、Cだけが必要な場合は、その列を指定してその製品を探したいのですか? –

+0

@KatieT 1は、 'MARGIN'引数によって行ごとに動作するよう' apply'に指示します。列の数を制限するには、 'apply'に使う列だけを渡す必要がありますが、これはインラインで行うことができます:' apply(Df.1 [c( "A"、 "B"、 "C" )]、1、prod、na.rm = T) ' – James

+0

これはまさに私が欲しかったことです - ありがとう@James! –

2

として@Jamesは、PROD言ったと動作します適用されますが、別の変数に格納し、あるいはそれを

Df.1$D = apply(Df.1, 1, prod, na.rm=T) 
をcbindingメモリを無駄にする必要はありません

データフレームに新しい変数を直接割り当てることができます。

> Df.1 <- data.frame(A = c(5,4,7,6,8,4),B = (c(1,5,2,4,9,1)),C=(c(2,3,NA,5,NA,9))) 
> Df.1 
    A B C 
1 5 1 2 
2 4 5 3 
3 7 2 NA 
4 6 4 5 
5 8 9 NA 
6 4 1 9 
> Df.1$D = apply(Df.1, 1, prod, na.rm=T) 
> Df.1$D 
[1] 10 60 14 120 72 36 
> Df.1 
    A B C D 
1 5 1 2 10 
2 4 5 3 60 
3 7 2 NA 14 
4 6 4 5 120 
5 8 9 NA 72 
6 4 1 9 36 
関連する問題