管道dplyr变异与未知的变量名称

时间:2018-04-20 13:11:32

标签: r dplyr piping

我尝试使用mutate中的dplyr和动态变量名称。我在SO(hereherehere)上发现了一些帖子,这些帖子让我更接近,但没有找到可行的解决方案。我不会想太多,但我需要你的帮助。

这是一个与我的问题非常相似的可重现的例子。我有两个字段的表,其中一个字段称为AD或任何其他名称。该字段是一个因素,但可以是字符或整数。我的功能需要转换为因子。

library(dplyr)

t1 <- data.frame(f1 = 1:4, AD = 1:4)
t2 <- data.frame(f1 = 1:4, FC = 1:4)

ff <- function(tt){

  # find the variable name
  if(any(colnames(tt)=="AD")){
    vv <- quo(AD)
  } else {
    vv <- colnames(tt) %>% .[.!="f1"]
    vv <- enquo(vv)
  }

  # make the mutate
  tt %>% mutate(!!quo_name(vv) := as.factor(!!vv))      
}

在前面引用的链接的帮助下,我设法使函数适用于具有AD的表格(使用quo!!:=我之前不知道的功能。

ff(tt=t1) %>% str
'data.frame':   4 obs. of  2 variables:
 $ f1: int  1 2 3 4
 $ AD: Factor w/ 4 levels "1","2","3","4": 1 2 3 4

这很有效。但是当我发送一个包含未知变量名的表时:

ff(tt=t2) %>% str
'data.frame':   4 obs. of  2 variables:
 $ f1: int  1 2 3 4
 $ FC: Factor w/ 1 level "FC": 1 1 1 1

我的FC现在错误,只有1个因素为FC

我认为问题出在我在第二个选项中设置vv的方式,它给了我错误的env值:

quo(AD)
<quosure>
  expr: ^AD
  env:  global


vv <- colnames(tt) %>% .[.!="f1"]
enquo(vv)
<quosure>
  expr: ^"FC"
  env:  empty

知道如何解决我的问题吗?我打开基础R解决方案,但它能够适应长管道程序。

1 个答案:

答案 0 :(得分:4)

那里你不需要enquo。这是为了将作为参数传递的值转换为quosure。相反,您需要将字符串转换为符号。为此,您可以使用as.name()rlang::sym()

ff <- function(tt){

  # find the variable name
  if(any(colnames(tt)=="AD")){
    vv <- quo(AD)
  } else {
    vv <- colnames(tt) %>% .[.!="f1"]
    vv <- as.name(vv)
  }

  # make the mutate
  tt %>% mutate(!!quo_name(vv) := as.factor(!!vv))      
}