如何将case_when与mutate_all一起使用以插入变量值

时间:2019-12-10 14:10:43

标签: r dplyr case-when

我有一个看似很小的问题。我想将mutate_all()case_when()结合使用。样本数据框:

tbl <- tibble( 
  x = c(0, 1, 2, 3, NA),
  y = c(0, 1, NA, 2, 3),
  z = c(0, NA, 1, 2, 3),
  date = rep(today(), 5)
)

我首先制作了一个数据帧,用下面的代码将所有NA都替换为零,并将值替换为1。

tbl %>%
 mutate_all(
    funs(
      case_when(
        . %>% is.na() ~ 0,
        TRUE ~ 1
      )))

现在,我想用空白("")替换NA值,并保持其他值不变。但是,我不知道如何以保留列值的方式设置TRUE值。

任何建议将不胜感激!

1 个答案:

答案 0 :(得分:1)

要将NA保留为"",我们可以使用replace_na中的tidyr

library(dplyr)
library(tidyr)
tbl %>%
     mutate_all(replace_na, "")
# A tibble: 5 x 3
#  x     y     z    
#  <chr> <chr> <chr>
#1 0     0     0    
#2 1     1     ""   
#3 2     ""    1    
#4 3     2     2    
#5 ""    3     3    

对于case_whenif_else,我们必须确保type的宽度相同。在这里,我们在插入character时将转换为"",因此请确保其他值也被强制转换为character

tbl %>%
   mutate_all(~ case_when(is.na(.) ~ "", TRUE ~ as.character(.)))

如果我们只想使用特定的列,则可以使用mutate_at

tbl %>%
   mutate_at(vars(x:y), ~ case_when(is.na(.) ~ "", TRUE ~ as.character(.)))

此外,为了简化OP文章中的代码,可以将其直接用as.integer+强制为整数

tbl %>% 
     mutate_all(~ as.integer(!is.na(.)))

或者如果我们使用case_when

tbl %>%
       mutate_all(~ case_when(is.na(.)~ 0, TRUE ~ 1))