2017-07-27 63 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]  @ 

我們使用:=運營商動態名使用字符串參數,我們解析表達式字符串進行了改造,並解開它!「