dplyr使用列名的字符向量进行变异

时间:2017-11-09 13:34:13

标签: r dplyr

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)

但我想从字符向量传递mutate参数, 我尝试了以下方法:

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)

但它没有用。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

要将tidyeval与UQ一起使用,您需要首先使用parse_quosure中的rlang将表达式解析为句子(例如,使用mtcars,因为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_现已弃用,因此我认为使用quosureUQ的tidyeval是新方法。