【问题标题】:dplyr mutate_at and case_whendplyr mutate_at 和 case_when
【发布时间】:2018-04-01 04:30:32
【问题描述】:

我想用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,但无法在其中找到解决方案。

谢谢!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢。这就说得通了。这是特定于 dplyr 还是只是 R 语法?
    • 这是一个dplyr 语法,更具体地与mutate/summarize at/if/all/funs 相关。
    • 我就是这么想的。你碰巧知道这类事情的好参考资料吗?我经常对作用域 dplyr 动词语法有疑问,不知道在哪里看
    • 如果您使用Rstudio,例如,您可以使用?mutate_at,阅读那里的文档并尝试以下示例。例如,最后一个示例涵盖了您的情况,其中注释说 如果 .funs 有名称或多个输入,则将包含函数名称
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    • 2019-05-28
    相关资源
    最近更新 更多