dplyr 0.7中已弃用的mutate_的等效替代方案是什么?

9

我在 dplyr 0.7 中找不到替代即将被弃用的 mutate_ 函数的方法。

mutate_ 函数在我的使用场景中非常有用:我将许多指令(以字符串格式)存储在数据库中(如果需要,可以进行过滤),并将这些指令应用于一个或多个数据框。

例如:

dplyr::tibble(test = "test@test") %>% 
  dplyr::mutate_(.dots = list("test2" = "substr(test, 1, 5)",
                              "test3" = "substr(test, 5, 5)"))

有没有一种方法可以使用dplyr 0.7将变量和指令保留为字符并进行操作?

文档 ?mutate_ 表示“dplyr 现在使用了整洁评估语义”,并提到了 rlang 包,该包有关于“整洁评估”的指南。如果你选择这条路,祝你好运。 - Frank
2个回答

9

稍微扩展一下MrFlick的例子,假设您有一些以字符串形式存储的指令,以及想要分配给结果计算的相应名称:

ln <- list( "test2", "test3" )
lf <- list( "substr(test, 1, 5)", "substr(test, 5, 5)" )

将名称与其说明匹配,并将所有内容转换为quosures:

ll <- setNames( lf, ln ) %>% lapply( rlang::parse_quosure )

根据aosmith的建议,现在可以使用特殊的!!!运算符将整个列表传递给mutate:

tibble( test = "test@test" ) %>% mutate( !!! ll )
# # A tibble: 1 x 3
#        test test2 test3
#       <chr> <chr> <chr>
# 1 test@test test@     @

1
你也可以使用mutate(X, !!! ll)而不是整个do.call步骤。 - aosmith
好主意,aosmith。我会更新答案的。谢谢。 - Artem Sokolov
非常感谢MrFlick,Artem和aosmith! - stephLH

5

这里有一个替代方案

a <- "test2"
b <- "test3"
dplyr::tibble(test = "test@test") %>% 
dplyr::mutate(a := !!rlang::parse_expr("substr(test, 1, 5)"),
  b := !!rlang::parse_expr("substr(test, 5, 5)"))
# # A tibble: 1 x 3
#        test     a     b
#       <chr> <chr> <chr>
# 1 test@test test@     @

我们使用:=运算符来动态地使用字符串命名参数,然后解析表达式字符串进行转换,并使用!!解包。

1
@TylerRinker 我已更新为parse_expr(),它不再被弃用,也不需要指定环境,因为我们实际上并没有使用它。 - MrFlick

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