dplyr中的向量化列操作

时间:2019-03-25 10:05:10

标签: r dplyr tidyverse

我正在寻找一种使用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 个答案:

答案 0 :(得分:1)

这是您要找的吗?

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对其进行求值。

答案 1 :(得分:1)

通过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))