将文本粘贴到dplyr mutate中

时间:2018-06-05 13:12:44

标签: r dplyr tidyverse

我希望能够传递一串变量来延迟到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),

这感觉应该是可能的。任何帮助将不胜感激。

3 个答案:

答案 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>