5

私は医師の診察記録の大きなデータフレームを持っています。リストされている11の診断コードの少なくとも1つが、関心のある特定の診断コードのセットで見つかった行のみを選択したいと思います。

データフレームは18列×39,019行です。6:16列の診断コードに興味があります。これらの11の診断列のみのデータサンプルを次に示します(識別可能な情報を保護するため)。

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

これが私が使おうとしたコードです:

mydiag <- c(401, 410, 411, 413, 415:417, 420:429, 434, 435, 444, 445, 451, 460:466, 480:486, 490:493, 496, 786)
y = apply(dt[,paste("diag", 1:11, sep="")], 1, function(x) sum((any(x !=NA %in% mydiag))))
y = as.data.frame(y)

ご覧のとおり、私が提供した2つの例の行では、最初の行を保持したいのですが、必要なコードがないため、2番目の行を破棄します。私が提供したコードサンプルは機能しません-39,019"1"値のベクトルを取得します。したがって、applyステートメントは論理的なものとして読み取られていると思いますが、すべての行に対象のコードがあるわけではないことを知っているので、その場合は1と0を期待していました。

この行選択タスクを実行するためのより良い方法はありますか?

4

2 に答える 2

5

!=NAそこにビットを入れて物事を過度に複雑にしていると思います。NAは登場しないのでmydiag、完全に落として構いません。したがって、適用ステートメントは次のようになります。

goodRows <- apply(dat, 1, function(x) any(x %in% mydiag))
dat[goodRows,]
#---------------
  diag1 diag2 diag3 diag4 diag5 diag6 diag7 diag8 diag9 diag10 diag11
1   786   272   401   782   250 91912   530    NA    NA     NA     NA
于 2012-05-07T16:00:44.033 に答える
2

問題はあなたの機能から来ていますfunction(x) sum((any(x !=NA %in% mydiag)))

x != NAを使用してより適切に構築できますが!is.na(x)、これは論理ベクトルを返すことを認識しておく必要があります。したがって、論理ベクトルの結果を取得し、結果が mydiag にあるかどうかを確認しています。na ではない値を取り、それらのいずれかが mydiag にあるかどうかを確認したいだけだと思います。

x[!is.na(x)] %in% mydiag

そのためにははるかにうまくいくでしょう。ただし、NA はベクトルに含まれていないため、NA をチェックする必要さえないため、NA である x の要素は false を返します。x %in% mydiag

function(x){any(x %in% mydiag)}

行が基準を満たしているかどうかを示す論理値を取得する良い方法です。

# Get the row numbers of the rows you want
id = apply(dt[,paste("diag", 1:11, sep="")], 1, function(x){any(x %in% mydiag)})
# Just grab those rows
y <- dt[id, ]
于 2012-05-07T15:59:09.860 に答える