5

私は医師の診察記録の大きなデータフレームを持っています。各レコード(行)には、最大11個の診断コードを含めることができます。各行にNA以外の診断コードがいくつあるか知りたいです。

データのサンプルは次のとおりです。

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

したがって、これらの2つの行では、行1に7つのコードがあり、行2に4つのコードがあることを知りたいと思います。データフレームは31,596行であるため、ループに時間がかかりすぎています。「apply」ステートメントを使用して処理を高速化したいと思います。

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

Rは、データセットの行数と同じ長さの1のベクトルを返すだけです。「any」の使用に何か問題があると思いますか?複数の列にわたる非NA値の数を数える良い方法はありますか?ありがとう!

4

2 に答える 2

9

使用is.naしてrowSums

z <- rowSums(!is.na(y[,paste("diag", 1:11, sep="")]))
于 2012-05-07T17:14:50.463 に答える
3

次のものも使用できます。

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

しかし、ジョシュア・ウルリッヒの答えははるかに速いです。

于 2012-05-07T17:42:33.547 に答える