2017-07-27 150 views
5

我找不到dplyr 0.7一种方法来取代mutate_功能,这将被弃用。dplyr 0.7当量为弃用mutate_

mutate_功能在我的使用情况是有用的:我存储在数据库(字符串格式)许多指令(即如果需要,可以过滤),并应用这些指令到一个或几个数据帧。

例如:

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

有没有办法用dplyr 0.7保持变量和指令的字符来做到这一点?

+0

doc' mutate_'声明“dplyr现在使用整齐的评估语义”,指的是对“整洁评估”有一个小插曲的rlang包。祝你好运,如果你沿着这条路走下去。 – Frank

回答

6

要扩大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的建议

,整个列表现在可以通过变异,使用特殊 !!!操作:

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

你也可以做'mutate(X,!!! ll)'而不是整个'do.call'步骤。 – aosmith

+0

伟大的想法,aosmith。我会更新答案。谢谢。 –

+0

非常感谢MrFlick,Artem和aosmith! – stephLH

3

这里的替代

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

我们使用:=运营商动态名使用字符串参数,我们解析表达式字符串进行了改造,并解开它!“