2012-05-07 2 views
4

私は博士の訪問記録の大きなデータフレームを持っています。各レコード(行)には、最大11個の診断コードを含めることができます。各行にどれほど多くの非NA診断コードがあるのか​​知りたい。ここでR:複数の列にまたがる非NA値の合計をとるための "apply"ステートメント

は、データのサンプルです:

diag1 diag2 diag3 diag4 diag5 diag6 diag7 diag8 diag9 diag10 diag11 
786 272 401 782 250 91912 530 NA NA NA  NA 
845 530 338 311 NA NA NA  NA NA NA  NA 

したがって、これら二列に、私はその行1は、7つのコードを持っていたし、2行目は4つのコードを持っていたかを知りたいでしょう。データフレームは31,596行なので、ループが長くなりすぎています。私は物事をスピードアップするために、「適用」ステートメントを使用したいと思います:

z = apply(y[,paste("diag", 1:11, sep="")], 1, function(x)sum({any(x[!is.na(x)])})) 

Rはちょうど1のデータセット内の行数と同じ長さであることのベクトルを返します。私は何かが "any"を使うことで間違っていると思いますか?誰もが複数の列にまたがって非NA値の数を数える良い方法はありますか?ありがとう!

答えて

9

だけis.narowSumsを使用します。

apply(y, 1, function(x) length(na.omit(x))) 

が、ジョシュアウルリッヒの答えは道高速です:

z <- rowSums(!is.na(y[,paste("diag", 1:11, sep="")])) 
+0

速度に敏感なアプリケーションでは、rowSums()に+1します。 –

+0

恐ろしい!ありがとう! – mEvans

3

をまた使用することができます。

関連する問題