R:“;套用;语句获取跨多个列的非NA值的数量之和

R:“;套用;语句获取跨多个列的非NA值的数量之和,r,function,rows,apply,any,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 N

我有一个医生就诊记录的大数据框。每个记录(行)最多可以有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
所以在这两行中,我想知道第1行有7个代码,第2行有4个代码。数据帧是31596行,因此循环时间太长。我想使用“应用”语句来加快速度:

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

R只返回1的向量,该向量的长度与数据集中的行数相同。我认为使用“any”有问题吗?是否有人有一个很好的方法来计算跨多个列的非NA值的数量?谢谢

只需使用
is.na
rowSums

z <- rowSums(!is.na(y[,paste("diag", 1:11, sep="")]))
z您还可以使用:

apply(y, 1, function(x) length(na.omit(x)))
但约书亚·乌尔里希的答案要快得多