Векторизованные операции над столбцами в dplyr - PullRequest
2 голосов
/ 25 марта 2019

Я ищу аккуратный способ включения векторизованных операций со столбцами с использованием dplyr.

В основном, с простым df следующим образом:

library(dplyr)
df <- data.frame("X" = runif(1:10), 
             "Y" = runif(1:10), "Z" = runif(1:10)) %>% 
 tbl_df() 

Я сейчас ищу применениеследующая векторизованная формула:

Formula <- "X / Y + lag(Z)"

Конечно, следующее не будет работать при поиске столбца 'X / Y + lag (Z)':

df %>% mutate(Result := !!sym(Formula))

Может кто-нибудьПредложите простой способ применения формулы из вектора непосредственно в трубе к столбцам для достижения:

df %>% mutate(Result = X/Y+lag(Z))

Ответы [ 2 ]

1 голос
/ 25 марта 2019

С tidyverse, parse_expr можно использовать

library(dplyr)    
df <- df %>% 
         mutate(Calc_Col = !! rlang::parse_expr(Formula))

, и если нам нужно передать имя столбца как переменную, используйте := (как @Nick упоминается в комментариях)

Name <- "Calc_Col" 
df <- df %>% 
        mutate(!!Name := !!rlang::parse_expr(Formula)) 
1 голос
/ 25 марта 2019

Это то, что вы ищете?

set.seed(1)
df <- data.frame("X" = runif(1:10), 
                 "Y" = runif(1:10), "Z" = runif(1:10)) %>% 
    tbl_df()

Formula <- "X / Y + lag(Z)"

df <- df %>% mutate(Result = eval(parse(text = Formula)))

        X      Y      Z Result
    <dbl>  <dbl>  <dbl>  <dbl>
 1 0.153  0.0158 0.527  NA    
 2 0.322  0.231  0.327   1.93 
 3 0.479  0.0958 0.365   5.33 
 4 0.764  0.537  0.105   1.79 
 5 0.180  0.223  0.0243  0.913
 6 0.178  0.538  0.975   0.355
 7 0.869  0.820  0.845   2.03 
 8 0.356  0.263  0.0628  2.20 
 9 0.0399 0.710  0.968   0.119
10 0.863  0.422  0.825   3.02

parse неоцененное выражение, затем eval используйте его.

...