如果不在case_when语句中,请保留值

时间:2016-08-31 19:46:26

标签: r dplyr

我的数据如下:

df <- expand.grid(grade = c("A", 1, "B", 2, 3, "C"), value = c(0, 1))

当我尝试替换A语句中的BCcase_when时,未替换的值将转到NA。 ..我希望他们留下来!

尝试:

library(dplyr)
df_new <- df %>% 
mutate(grade = case_when(
.$grade == "A" ~ 1,
.$grade == "B" ~ 2,
.$grade == "C" ~ 3))

期望的输出:

df <- data.frame(grade = c(rep(1, 4), rep(2, 4), rep(3, 4)), value = rep(c(0, 1), 6))

注意**寻找case_when解决方案NOT ifelse解决方案。

1 个答案:

答案 0 :(得分:25)

case_when语句是双边公式,其中左侧是逻辑测试,右侧是该测试为TRUE时要分配的值。

逻辑测试从未匹配的值会获得默认替换值:NA。为了使这些值不被NA所取代,请包含最终的全部测试和替换。

df %>%
  mutate(old_grade = grade) %>%
  select(old_grade, grade, value) %>%
  mutate(grade = case_when(
    .$grade == "A" ~ 1,
    .$grade == "B" ~ 2,
    .$grade == "C" ~ 3,
    TRUE ~ as.numeric(as.character(.$grade))))
#> Warning: NAs introduced by coercion
#>    old_grade grade value
#> 1          A     1     0
#> 2          1     1     0
#> 3          B     2     0
#> 4          2     2     0
#> 5          3     3     0
#> 6          C     3     0
#> 7          A     1     1
#> 8          1     1     1
#> 9          B     2     1
#> 10         2     2     1
#> 11         3     3     1
#> 12         C     3     1

编辑:哎呀,我忘了grade是一个因素。解决方案现在可以使用。