Заменить значения в кадре данных на основе другого фактора, который содержит NA в R - PullRequest
4 голосов
/ 31 марта 2010

У меня есть фрейм данных, который содержит (среди прочего) числовой столбец с концентрацией и столбец фактора с флагом статуса. Этот флаг состояния содержит NA.

Вот пример

df<-structure(list(conc = c(101.769, 1.734, 62.944, 92.697, 25.091, 27.377, 24.343, 55.084, 0.335, 23.280), status = structure(c(NA, NA, NA, NA, NA, NA, 2L, NA, 1L, NA), .Label = c("<LLOQ", "NR"), class = "factor")), .Names = c("conc", "status"), row.names = c(NA, -10L), class = "data.frame")

Я хочу заменить столбец концентрации строкой для некоторых значений столбца флага или значением концентрации, отформатированным до определенного числа значащих цифр.

Когда я пытаюсь это

ifelse(df$status=="NR","NR",df$conc)

NA в флаге состояния не запускают ни условие истины, ни ложь (и возвращают NA) - как предполагает документация. Я мог бы циклически проходить по строкам и использовать IF, тогда как в других, но это кажется неэффективным.

Я что-то упустил? Я также пробовал as.character (df $ status), который не работает. Мой моджо, должно быть, становится низким ....

Ответы [ 3 ]

5 голосов
/ 31 марта 2010

Используйте %in% вместо ==:

ifelse(df$status %in% "NR","NR", df$conc)

Сравнение двух методов бок о бок:

data.frame(df, ph = ifelse(df$status=="NR","NR",df$conc), mp = ifelse(df$status %in% "NR","NR",df$conc))

Проверьте ?match для получения дополнительной информации - я не уверен, что смог бы объяснить это хорошо.

3 голосов
/ 31 марта 2010

Вы должны явно проверить для NA, чтобы вы могли использовать:

ifelse(df$status=="NR" | is.na(df$status),"NR",df$conc) # gives you NR for NA

или

ifelse(df$status=="NR" & !is.na(df$status),"NR",df$conc) # gives you df$conc for NA
2 голосов
/ 31 марта 2010

Как насчет тестирования на отсутствие:

ifelse(is.na(df$status), df$conc, as.character(df$status))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...