R: Добавить столбец с проверкой состояния на три столбца? - PullRequest
0 голосов
/ 02 июля 2011

Мой df1 выглядит следующим образом:

df1 <- data.frame(A=c("a","b","c","d","e"), B=c("f","g","t","g","u"), C=c("M","NA","NA","NA","M"), D=c("A","NA","NA","NA","NA"), E=c("NA","NA","NA","NA","G"), G=c(1:5))

  A B  C  D  E G
1 a f  M  A NA 1
2 b g NA NA NA 2
3 c t NA NA NA 3
4 d g NA NA NA 4
5 e u  M NA  G 5

Я хочу добавить столбец на основе показаний в столбцах C, D и E. Если все равны NA, я хочу добавить X в столбец H. Есликто-нибудь из них не NA, я хочу добавить ДА в столбец H. Результаты выглядят следующим образом:

  A B  C  D  E G H
1 a f  M  A NA 1 YES
2 b g NA NA NA 2 X
3 c t NA NA NA 3 X
4 d g NA NA NA 4 X
5 e u  M NA  G 5 YES

Могут ли эксперты научить меня, как это эффективно делать с R?

Ответы [ 2 ]

5 голосов
/ 02 июля 2011
transform(df1, H = ifelse(is.na(C) & is.na(D) & is.na(E), "X", "YES"))

Обратите внимание, что это работает, только если NA s фактически закодированы как NA, а не строка "NA".

См. ?transform и ?ifelse для описания этих функций. Один оператор & связывает векторные операнды элемент за элементом и выполняет логическую операцию над каждой парой, возвращая логический вектор.

2 голосов
/ 02 июля 2011

Для некоторого разнообразия, здесь есть альтернативное решение, использующее apply, которое не требует вызова is.na для каждого столбца в отдельности:

df1$H <- apply(df1[,3:5],1,function(x){if (!all(is.na(x))) "YES" else "X"})

с тем же предупреждением, что Даниэль отмечает о кодировании пропущенных значенийкак NA, а не "NA".

...