dplyr mutate_at和case_when

时间:2018-04-01 04:30:32

标签: r dplyr mutate

我想用starts_with()识别变量,然后执行case_when变异。

例如,让我们说我想做相同的事情:

mtcars$mpg[mtcars$mpg == 21.0] <- 5; mtcars

我的尝试:

mtcars %>%
  mutate_at(
    vars(starts_with("mpg")),
    funs(. = case_when(
      . == 21.0 ~ 5,
      TRUE ~ .
    ))
  )

我做错了什么? dplyr文档似乎没有很多mutate_at / mutate_each的例子(this thread似乎有同样的抱怨),所以我很难用这些函数。也许我不是在寻找合适的地方?

我知道this thread,但无法在那里找到解决方案。

谢谢!

1 个答案:

答案 0 :(得分:9)

funs创建一个函数列表,当您执行funs(. = ...)时,它会创建名为.的命名函数,这会导致使用以下任一项生成新列如果您只有一列,则.的名称;如果您有多列要变异,则名称后缀为.;如果您需要覆盖原始列,只需将匿名函数直接传递给funs即可保留未命名的函数。在您的情况下,删除. =中的funs应该有效;

mtcars %>%
  mutate_at(
    vars(starts_with("mpg")),
    funs(case_when(
      . == 21.0 ~ 5,
      TRUE ~ .
    ))
  )