在mutate_at中使用case_when

Kon*_*rad 5 r dplyr mutate

我想case_when在内部使用mutate_at,如下例所示:

mtcars %>% 
  mutate_at(.vars = vars(vs, am),
            .funs = funs(case_when(
              . %in% c(1,0,9) ~ TRUE
              . %in% c(2,20,200) ~ FALSE
              TRUE ~ as.character(.)
            )))
Run Code Online (Sandbox Code Playgroud)

. =funs()通话中使用的替代版本也不起作用.

mtcars %>%
  mutate_at(.vars = vars(vs, am),
            .funs = funs(. = case_when(
              . %in% c(1, 0, 9) ~ TRUE
              . %in% c(2, 20, 200) ~ FALSE
              TRUE ~ as.character(.)
            )))
Run Code Online (Sandbox Code Playgroud)

期望的结果

mtcars %>% 
  mutate_at(.vars = vars(vs, am),
         .funs = funs(ifelse(. %in% c(1, 0, 9), TRUE, FALSE)))
Run Code Online (Sandbox Code Playgroud)

FALSE可以用第二次ifelse()调用替换,我为了简洁而没有包括.

akr*_*run 8

我们需要,将每个案例分开.另外,如果我们保留最后一个选项character,那么它也TRUE/FALSE应该是字符.没有混合的类型

mtcars %>%
  mutate_at(.vars = vars(vs, am),
        .funs = funs(. = case_when(
          . %in% c(1, 0, 9) ~ TRUE,
          . %in% c(2, 20, 200) ~ FALSE,
          TRUE ~ TRUE
        )))
Run Code Online (Sandbox Code Playgroud)

如果我们需要创建character类,并且如果两种情况中的任何一种不正确,也可以将列作为字符返回

mtcars %>%
 mutate_at(.vars = vars(vs, am),
        .funs = funs(. = case_when(
          . %in% c(1, 0, 9) ~ "Yes",
          . %in% c(2, 20, 200) ~ "No",
          TRUE ~ as.character(.)
        ))) 
Run Code Online (Sandbox Code Playgroud)