我希望能够传递一串变量来延迟到dplyr mutate函数,但是遇到了一些麻烦。例如,这很好用:
text <- "lag(depth)"
diamonds %>% mutate_(text)
但是这不会发生错误:
text <- "lag(depth), lag(table)"
diamonds %>% mutate_(text)
Error in parse(text = x) : <text>:1:11: unexpected ','
1: lag(depth),
这感觉应该是可能的。任何帮助将不胜感激。
答案 0 :(得分:3)
你必须连接你的文字:
text <- c("lag(depth)", "lag(table)")
然后使用.dots
来解析您的text
:
library(dplyr)
diamonds %>%
mutate_(.dots = text)
## A tibble: 53,940 x 12
# carat cut color clarity depth table price x y z `lag(depth)`
# <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <dbl>
# 1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43 NA
# 2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31 61.5
# 3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31 59.8
# 4 0.290 Premium I VS2 62.4 58 334 4.2 4.23 2.63 56.9
# 5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75 62.4
# 6 0.24 Very G~ J VVS2 62.8 57 336 3.94 3.96 2.48 63.3
# 7 0.24 Very G~ I VVS1 62.3 57 336 3.95 3.98 2.47 62.8
# 8 0.26 Very G~ H SI1 61.9 55 337 4.07 4.11 2.53 62.3
# 9 0.22 Fair E VS2 65.1 61 337 3.87 3.78 2.49 61.9
#10 0.23 Very G~ H VS1 59.4 61 338 4 4.05 2.39 65.1
## ... with 53,930 more rows, and 1 more variable: `lag(table)` <dbl>
答案 1 :(得分:0)
作为替代解决方案,您可以尝试使用mutate_at
。必须使用此方法复制函数lag
。
library(tidyverse)
a <- unlist(stringi::stri_extract_all_words(text))
diamonds %>%
mutate_at(.vars = a[a %in% colnames(diamonds)], .funs = c(lag=a[duplicated(a)]))
# A tibble: 53,940 x 12
carat cut color clarity depth table price x y z depth_lag table_lag
<dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43 NA NA
2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31 61.5 55
3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31 59.8 61
4 0.290 Premium I VS2 62.4 58 334 4.2 4.23 2.63 56.9 65
5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75 62.4 58
6 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48 63.3 58
7 0.24 Very Good I VVS1 62.3 57 336 3.95 3.98 2.47 62.8 57
8 0.26 Very Good H SI1 61.9 55 337 4.07 4.11 2.53 62.3 57
9 0.22 Fair E VS2 65.1 61 337 3.87 3.78 2.49 61.9 55
10 0.23 Very Good H VS1 59.4 61 338 4 4.05 2.39 65.1 61
答案 2 :(得分:0)
我们可以使用parse_exprs
rlang
执行此操作
library(tidyverse)
library(rlang)
text <- "lag(depth); lag(table)" #note the `;` separation
diamonds %>%
mutate(!!! parse_exprs(text))
# A tibble: 53,940 x 12
# carat cut color clarity depth table price x y z `lag(depth)`
# <dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <dbl>
# 1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43 NA
# 2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31 61.5
# 3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31 59.8
# 4 0.290 Premium I VS2 62.4 58 334 4.2 4.23 2.63 56.9
# 5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75 62.4
# 6 0.24 Very G… J VVS2 62.8 57 336 3.94 3.96 2.48 63.3
# 7 0.24 Very G… I VVS1 62.3 57 336 3.95 3.98 2.47 62.8
# 8 0.26 Very G… H SI1 61.9 55 337 4.07 4.11 2.53 62.3
# 9 0.22 Fair E VS2 65.1 61 337 3.87 3.78 2.49 61.9
#10 0.23 Very G… H VS1 59.4 61 338 4 4.05 2.39 65.1
# ... with 53,930 more rows, and 1 more variable: `lag(table)` <dbl>