提问者:小点点

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)

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

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个答案

匿名用户

要将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_现在已经弃用了,所以我认为使用quosureUQ进行tidyera是一种新的方法。