Вставка текста в dplyr mutate - PullRequest
0 голосов
/ 05 июня 2018

Я хотел бы иметь возможность передавать строку переменных для задержки в функцию 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 голосов
/ 05 июня 2018

в качестве альтернативного решения вы можете попробовать использовать 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
0 голосов
/ 05 июня 2018

Мы могли бы сделать это с 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>
0 голосов
/ 05 июня 2018

Вы должны объединить свой текст:

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>
...