2010-03-31 4 views
4

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

Вот пример

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) - как документация предполагает, что это будет. Я мог бы перебирать строки и использовать IF, тогда еще на каждом, но это кажется неэффективным.

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

ответ

5

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

+0

совершенный - это работает очень хорошо. Спасибо Мэтту – PaulHurleyuk

2

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

ifelse(is.na(df$status), df$conc, as.character(df$status)) 
3

Вы должны явно тест на 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 
Смежные вопросы