R: оператор apply, чтобы взять сумму количества значений, отличных от NA, по нескольким столбцам

У меня есть большой массив записей о посещениях врача. Каждая запись (строка) может иметь до 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 кода. Фрейм данных составляет 31 596 строк, поэтому цикл занимает слишком много времени. Я хотел бы использовать оператор «применить», чтобы ускорить процесс:

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

R просто возвращает вектор из единиц, длина которого равна количеству строк в наборе данных. Я думаю, что что-то не так с использованием "любого"? Есть ли у кого-нибудь хороший способ подсчитать количество значений, отличных от NA, в нескольких столбцах? Спасибо!


person mEvans    schedule 07.05.2012    source источник


Ответы (2)


Просто используйте is.na и rowSums:

z <- rowSums(!is.na(y[,paste("diag", 1:11, sep="")]))
person Joshua Ulrich    schedule 07.05.2012

Вы также можете использовать:

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

но ответ Джошуа Ульриха намного быстрее.

person Tyler Rinker    schedule 07.05.2012