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