Case_when和或if_else dplyr-当NA使用另一列中的值时

时间:2019-06-04 19:36:37

标签: r if-statement dplyr case-when

我想使用其他列中的值替换NA值。在此示例中,我在df中的最后四个值在“计数”列中有NA-我希望将NA替换为“值”列中的值。

这是一个虚拟数据集

df <- structure(list(First = structure(c(17995, 17997, 17929, 17919, 
17808, 18031, NA, NA, NA, NA), class = "Date"), Last = 
structure(c(17999, 
17998, 17929, 17919, 17809, 18031, 17965, 17965, 17965, 17965
), class = "Date"), days = c(5, 2, 1, 1, 2, 1, NA, NA, NA, NA
), variable = structure(c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 1L, 2L, 
3L), .Label = c("0-12", "0-25", "0-50", "0-100"), class = "factor"), 
value = c(1, 0, 1, 1, 1, 1, 1, 0, 1, 1), count = c(5, 0, 
1, 1, 2, 1, NA, NA, NA, NA)), class = "data.frame", row.names = c(NA, 
-10L))

关于如何解决它的一些想法。...但是由于我的编码技巧很差而无法正常工作:

 df <- df %>%
 mutate(a = if_else(count == NA, value, if_else(count >=0, count, a)))

或者case_when有办法吗?

谢谢。

3 个答案:

答案 0 :(得分:0)

你快到了

df <- df %>% mutate(a= ifelse(is.na(count), value, count))

答案 1 :(得分:0)

library(dplyr)
df <- df %>%
  dplyr::mutate(a = ifelse(is.na(count), value,
                           ifelse(count >= 0, count, "error")))

答案 2 :(得分:0)

正如在评论之一中已经说过的那样,在这种情况下,由于 NAs,coalesce 是最佳解决方案:

df %>% 
  dplyr::mutate(a = coalesce(count, value))

但是在 dplyr 中使用 case_when() 的解决方案也很有用:

df %>% 
  dplyr::mutate(a = case_when(!is.na(count) ~ count,
                              TRUE ~ value))