Замените значения в фрейме данных на основе другого фактора, который содержит NA в R

У меня есть кадр данных, который содержит (среди прочего) числовой столбец с концентрацией и столбец фактора с флагом состояния. Этот флаг состояния содержит 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), который не работает. Мое настроение, должно быть, становится низким ....


person PaulHurleyuk    schedule 31.03.2010    source источник


Ответы (3)


Используйте %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 для получения дополнительной информации - я не уверен, что смогу хорошо объяснить.

person Matt Parker    schedule 31.03.2010

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

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

or

ifelse(df$status=="NR" & !is.na(df$status),"NR",df$conc) # gives you df$conc for NA
person Marek    schedule 31.03.2010

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

ifelse(is.na(df$status), df$conc, as.character(df$status))
person Aniko    schedule 31.03.2010