dplyr中的mutate_at和case_when

8

我想使用starts_with()函数识别变量,然后进行case_when变异。

例如,假设我想要执行以下操作的等效操作:

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

My attempt:

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

我做错了什么?dplyr文档似乎没有许多mutate_at/mutate_each的示例(这个帖子中也有相同的投诉),所以我很难使用这些函数。也许我没有找对地方吗?
我知道这个帖子,但里面没有解决方案。
谢谢!
1个回答

17

funs创建函数列表,当你执行funs(. = ...)时,它会创建以.为名称的具名函数,从而生成一个或多个新列。如果只有一列,则生成具有.名称的新列;如果有多列要变异,则生成带有.后缀的名称。如果您需要覆盖原始列,请直接将匿名函数传递给funs以使函数无名称。在您的情况下,只需删除funs中的. =即可。

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

非常感谢。这很有道理。这是特定于dplyr还是仅适用于R语法? - lost
这是dplyr语法,更具体地涉及到mutate/summarize at/if/all/funs - Psidom
这正是我想的。你知道有关这种事情的好参考资料吗?我经常对作用域dplyr动词语法有疑问,不确定该去哪里寻找答案。 - lost
2
如果您使用 Rstudio,例如,您可以使用 ?mutate_at 命令,阅读文档并尝试下面的示例。例如,最后一个示例中的注释指出:如果 .funs 具有名称或多个输入,则将包括函数名称,这也适用于您的情况。 - Psidom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接