Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
管道dplyr使用未知变量名进行变异_R_Dplyr_Piping - Fatal编程技术网

管道dplyr使用未知变量名进行变异

管道dplyr使用未知变量名进行变异,r,dplyr,piping,R,Dplyr,Piping,我正在尝试使用mutatefromdplyr和动态变量名。我在SO(,and)上找到了一些帖子,这些帖子让我更接近于一个可行的解决方案,但并不是一个可行的解决方案。我不认为少了多少,但我需要你的帮助 这是一个与我的问题非常相似的可重复的例子。我的表有两个字段,其中一个称为AD或任何其他名称。此字段可能是一个因子,但可以是字符或整数。我的函数需要转换为因子 library(dplyr) t1 <- data.frame(f1 = 1:4, AD = 1:4) t2 <- data.f

我正在尝试使用
mutate
from
dplyr
和动态变量名。我在SO(,and)上找到了一些帖子,这些帖子让我更接近于一个可行的解决方案,但并不是一个可行的解决方案。我不认为少了多少,但我需要你的帮助

这是一个与我的问题非常相似的可重复的例子。我的表有两个字段,其中一个称为
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))      
}
这很有效。但当我发送一个具有未知变量名的表时:

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
现在错误,只有一个因素是
FC

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

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


vv <- colnames(tt) %>% .[.!="f1"]
enquo(vv)
<quosure>
  expr: ^"FC"
  env:  empty
quo(广告)
表达式:^AD
环境:全球
vv%。!=“f1”]
enquo(vv)
表达式:^“FC”
环境:空

你知道怎么解决我的问题吗?我对base R解决方案持开放态度,但它似乎能够适应较长的管道程序。

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


ff谢谢,似乎我也可以在
AD
部分中使用
as.name
:`vv
quo()
创建一个不仅捕获表达式/符号而且还捕获环境的quosure。在这种特殊情况下,您并不真正对捕获环境感兴趣,因为您只想在变异链中的数据上下文中计算符号。如果您有一个比列名更复杂的表达式,则必须使用比
as.name()
更奇特的表达式。
quo(AD)
<quosure>
  expr: ^AD
  env:  global


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