【问题标题】:Using case_when within mutate_at在 mutate_at 中使用 case_when
【发布时间】:2017-12-19 13:19:37
【问题描述】:

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

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(.)
            )))

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(.)
            )))

期望的结果

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

FALSE 可以替换为第二个 ifelse() 调用,为简洁起见,我没有包括在内。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们需要, 来分隔每个案例。另外,如果我们将最后一个选项保留为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
            )))
    

    如果我们需要创建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(.)
            ))) 
    

    【讨论】:

    • 所以问题出在最后是as.character(.),因为这似乎破坏了管道?
    • @Konrad 你也有,的问题
    • 啊,错字了。
    • 如果您需要将另一列的信息放入 case_when。那是不可能的吗?
    • @Dan 你的意思是像mtcars %>% mutate_at(.vars = vars(vs, am), .funs = funs(case_when(mtcars$gear ==4| . %in% 1 ~"Yes", TRUE ~ as.character(.))))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多