具有未知变量名称的管道 dplyr 突变
piping dplyr mutate with unknown variable name
我正在尝试将 dplyr
中的 mutate
与动态变量名称一起使用。我在 SO (here, here and ) 上找到了几个 post,这让我更接近但不是可行的解决方案。我不认为缺少什么,但我需要你的帮助。
这是一个与我的问题非常相似的可重现示例。我有 tables 有 2 个字段,其中之一称为 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))
}
在前面引用的 link 的帮助下,我设法使该函数适用于具有 AD
的 table(使用 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
这很好用。但是当我发送一个带有未知变量名的 table 时:
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 解决方案,但它能够适应长管道程序。
那里不需要 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))
}
我正在尝试将 dplyr
中的 mutate
与动态变量名称一起使用。我在 SO (here, here and
这是一个与我的问题非常相似的可重现示例。我有 tables 有 2 个字段,其中之一称为 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))
}
在前面引用的 link 的帮助下,我设法使该函数适用于具有 AD
的 table(使用 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
这很好用。但是当我发送一个带有未知变量名的 table 时:
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 解决方案,但它能够适应长管道程序。
那里不需要 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))
}