R:"apply"语句以获取跨多个列的非NA值的总和

mEv*_*ans 5 r function rows apply any

我有大量的医生访问记录数据框.每条记录(行)最多可包含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
Run Code Online (Sandbox Code Playgroud)

所以在这两行中,我想知道第1行有7个代码,第2行有4个代码.数据帧为31,596行,因此循环过程太长.我想使用"apply"语句加快速度:

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

R只返回1的向量,其长度与数据集中的行数相同.我觉得使用"any"有问题吗?有没有人有一个很好的方法来计算多列中非NA值的数量?谢谢!

Jos*_*ich 9

只需使用is.narowSums:

z <- rowSums(!is.na(y[,paste("diag", 1:11, sep="")]))
Run Code Online (Sandbox Code Playgroud)