data是一个data. frame,包含:date、a、b、c、d列。最后4个是数字
Y.columns <- c("a")
X.columns <- c("b","c","d")
我需要什么:
data.mutated <- data %>%
mutate(Y = a, X = b+c+d) %>%
select(date,Y,X)
但我想从字符向量传递突变参数,我尝试了以下方法:
Y.string <- paste(Y.columns, collapse='+')
X.string <- paste(X.columns, collapse='+')
data.mutated <- data %>%
mutate(Y = UQ(Y.string), X = UQ(X.string)) %>%
select(date,Y,X)
但没有成功。任何帮助都很感激。
要将tidyval与UQ
一起使用,您需要首先使用rlang
中的parse_quosure
将表达式解析为quosure(使用mtcar
作为示例,因为OP的问题不可重现):
Y.columns <- c("cyl")
X.columns <- c("disp","hp","drat")
Y.string <- paste(Y.columns, collapse='+')
X.string <- paste(X.columns, collapse='+')
library(dplyr)
library(rlang)
mtcars %>%
mutate(Y = UQ(parse_quosure(Y.string)),
X = UQ(parse_quosure(X.string))) %>%
select(Y,X)
或使用!!
:
mtcars %>%
mutate(Y = !!parse_quosure(Y.string),
X = !!parse_quosure(X.string)) %>%
select(Y,X)
结果:
Y X
1 6 273.90
2 6 273.90
3 4 204.85
4 6 371.08
5 8 538.15
6 6 332.76
7 8 608.21
8 4 212.39
9 4 239.72
10 6 294.52
...
注:
mutate_
现在已经弃用了,所以我认为使用quosure
和UQ
进行tidyera是一种新的方法。