dplyr::mutate 取消引用 RHS
dplyr::mutate unquote RHS
我想知道如何在 dplyr
方法(如 mutate
)中正确地 UQ
字符串在 RHS 上创建变量名称。请参阅我在此 MWE 的 wilcox.test
部分的评论中收到的错误消息:
require(dplyr)
dfMain <- data.frame(
base = c(rep('A', 5), rep('B', 5)),
id = letters[1:10],
q0 = rnorm(10)
)
backgs <- list(
A = rnorm(13),
B = rnorm(11)
)
fun <- function(dfMain, i = 0){
pcol <- sprintf('p%i', i)
qcol <- sprintf('q%i', i)
(
dfMain %>%
group_by(id) %>%
mutate(
!!pcol := ifelse(
!is.nan(!!qcol) &
length(backgs[[base]]),
wilcox.test(
# !!(qcol) - backgs[[base]]
# object 'base' not found
# (!!qcol) - backgs[[base]]
# non-numeric argument to binary operator
(!!qcol) - backgs[[base]]
)$p.value,
NaN
)
)
)
}
dfMain <- dfMain %>% fun()
我猜 !!(qcol) ...
它被解释为我想取消对整个表达式的引用,而不仅仅是变量名,这就是它找不到 base
的原因?我还发现 (!!qcol)
returns 字符串本身,所以 -
运算符无法处理它也就不足为奇了。
通过将定义 qcol
的行更改为:
,您的代码应该可以按预期工作
qcol <- as.symbol(sprintf('q%i', i))
也就是说,由于 qcol
是一个字符串,您需要在取消引用之前将其转换为一个符号,以便在您的 mutate
中正确评估它。此外,我假设您要引用的列是您在数据中定义的 q0
列,而不是名为 qval0
.
的不存在的列
我想知道如何在 dplyr
方法(如 mutate
)中正确地 UQ
字符串在 RHS 上创建变量名称。请参阅我在此 MWE 的 wilcox.test
部分的评论中收到的错误消息:
require(dplyr)
dfMain <- data.frame(
base = c(rep('A', 5), rep('B', 5)),
id = letters[1:10],
q0 = rnorm(10)
)
backgs <- list(
A = rnorm(13),
B = rnorm(11)
)
fun <- function(dfMain, i = 0){
pcol <- sprintf('p%i', i)
qcol <- sprintf('q%i', i)
(
dfMain %>%
group_by(id) %>%
mutate(
!!pcol := ifelse(
!is.nan(!!qcol) &
length(backgs[[base]]),
wilcox.test(
# !!(qcol) - backgs[[base]]
# object 'base' not found
# (!!qcol) - backgs[[base]]
# non-numeric argument to binary operator
(!!qcol) - backgs[[base]]
)$p.value,
NaN
)
)
)
}
dfMain <- dfMain %>% fun()
我猜 !!(qcol) ...
它被解释为我想取消对整个表达式的引用,而不仅仅是变量名,这就是它找不到 base
的原因?我还发现 (!!qcol)
returns 字符串本身,所以 -
运算符无法处理它也就不足为奇了。
通过将定义 qcol
的行更改为:
qcol <- as.symbol(sprintf('q%i', i))
也就是说,由于 qcol
是一个字符串,您需要在取消引用之前将其转换为一个符号,以便在您的 mutate
中正确评估它。此外,我假设您要引用的列是您在数据中定义的 q0
列,而不是名为 qval0
.