2012-05-07 44 views
4

我有一個醫生訪問記錄的大數據框。每個記錄(行)最多可以有11個診斷代碼。我想知道每行有多少個非NA診斷代碼。R:「應用」語句取多個列中非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碼。數據框是31,596行,因此循環太長了。我想用一個「應用」語句加快速度:

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

[R剛剛返回1的是相同的長度,數據集中行數的向量。我認爲使用「任何」有問題?有沒有人有一個很好的方法來計算跨多列的非NA值的數量?謝謝!

回答

9

只需使用is.narowSums

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

+1對於速度敏感的應用程序中的rowSums()。 –

+0

太棒了!謝謝! – mEvans

3

您還可以使用:

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

但約書亞Ulrich的答案是方式更快。