【问题标题】:dplyr::funs() soft deprecated - update to return variable namedplyr::funs() 软弃用 - 更新以返回变量名
【发布时间】:2020-11-30 11:38:24
【问题描述】:

在这方面花了很多时间,所以希望有人能提供建议。我有一段使用 funs() 的代码,该代码已被软性弃用,因此尝试了替代方法,但无法使其按预期工作。

旧:

df %>% mutate_at(vars(x,y,z), 
                 .funs = funs(Comment = case_when(
  .%in% "YES") ~ deparse(substitute(.))))

这给出了三个新变量:x_Comment、y_Comment 和 z_Comment - 如果相关变量包含“YES”,则将包含相关变量名称(“x”、“y”或“z”)

更新:

df %>% mutate_at(vars(x,y,z), 
                 .funs = list(Comment = ~case_when(
  .%in% "YES") ~ deparse(substitute(.))))

我已根据有关 funs() 被软弃用的警告更新了代码,但上述内容不起作用。它按预期给出了三个新变量:x_Comment、y_Comment 和 z_Comment - 但是如果相关变量包含“YES”,它会给出“.”。而不是变量名。

任何解决方案 - 最好是 tidyverse 非常感谢!

谢谢!

【问题讨论】:

  • 请注意,. %in% "YES" 等同于 . == "YES"
  • @KonradRudolph 谢谢!当向量中有多个选项时,我使用 %in% - 已简化示例以在此处发布并保持原样。

标签: r dplyr tidyverse deprecated


【解决方案1】:

这是你想要的吗?

library(tidyverse)

df <- tibble(
        x=c("Yes", "No",  "No"),
        y=c("No",  "Yes", "No"),
        z=c("No",  "No",  "Yes")
)

df %>% 
    mutate(
      across(everything(), 
      ~ifelse(.x == "Yes", cur_column(), ""), 
      .names="Comment_{col}")
    )
# A tibble: 3 x 6
  x     y     z     Comment_x Comment_y Comment_z
  <chr> <chr> <chr> <chr>     <chr>     <chr>    
1 Yes   No    No    "x"       ""        ""       
2 No    Yes   No    ""        "y"       ""       
3 No    No    Yes   ""        ""        "z"   

请注意,mutate_at 也已弃用。

【讨论】:

  • 非常感谢您的快速回复!查看您的输出正是我想要的 - 但是,我认为我的 dplyr (0.8.5) 版本比您的版本旧,因为它无法识别 cross() 或 cur_column()。我的 R 版本是 3.6.1(我无法控制)- 最初应该指定道歉!另外,感谢有关 mutate_at() 的提醒 - 我还没有收到有关此的警告。你知道什么时候/什么版本被弃用吗?非常感谢您的帮助!
  • 是的,你是对的。我在dplyr v1.0.0。我认为这是你的下一个版本。我很确定在引入acrosscur_column 时也是如此。我猜dplyr 升级不适合您?...
  • 我会考虑升级 dplyr,然后会使用你的答案,因为这正是我想要的。非常感谢您的帮助!
  • 插话补充说,这解决了一个非常相似的问题,我需要将一组调查响应从字符重新编码为数字。所以谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 2013-09-24
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
相关资源
最近更新 更多