【发布时间】:2018-07-28 10:51:06
【问题描述】:
我正在尝试使用dplyr 包为mutate() 调用提供一个包含多个列名的向量。下面的可重现示例:
stackdf <- data.frame(jack = c(1,NA,2,NA,3,NA,4,NA,5,NA),
jill = c(1,2,NA,3,4,NA,5,6,NA,7),
jane = c(1,2,3,4,5,6,NA,NA,NA,NA))
two_names <- c('jack','jill')
one_name <- c('jack')
# jack jill jane
# 1 1 1
# NA 2 2
# 2 NA 3
# NA 3 4
# 3 4 5
# NA NA 6
# 4 5 NA
# NA 6 NA
# 5 NA NA
# NA 7 NA
我能够弄清楚如何使用“一个变量”版本,但不知道如何将其扩展到多个变量?
# the below works as expected, and is an example of the output I desire
stackdf %>% rowwise %>% mutate(test = anyNA(c(jack,jill)))
# A tibble: 10 x 4
jack jill jane test
<dbl> <dbl> <dbl> <lgl>
1 1 1 1 FALSE
2 NA 2 2 TRUE
3 2 NA 3 TRUE
4 NA 3 4 TRUE
5 3 4 5 FALSE
6 NA NA 6 TRUE
7 4 5 NA FALSE
8 NA 6 NA TRUE
9 5 NA NA TRUE
10 NA 7 NA TRUE
# using the one_name variable works if I evaluate it and then convert to
# a name before unquoting it
stackdf %>% rowwise %>% mutate(test = anyNA(!!as.name(eval(one_name))))
# A tibble: 10 x 4
jack jill jane test
<dbl> <dbl> <dbl> <lgl>
1 1 1 1 FALSE
2 NA 2 2 TRUE
3 2 NA 3 FALSE
4 NA 3 4 TRUE
5 3 4 5 FALSE
6 NA NA 6 TRUE
7 4 5 NA FALSE
8 NA 6 NA TRUE
9 5 NA NA FALSE
10 NA 7 NA TRUE
如何扩展上述方法以便可以使用two_names 向量?使用 as.name 只需要一个对象,因此它不起作用。
这里的问题类似:Pass a vector of variable names to arrange() in dplyr。该解决方案“有效”,因为我可以使用以下代码:
two_names2 <- quos(c(jack, jill))
stackdf %>% rowwise %>% mutate(test = anyNA(!!!two_names2))
但是,如果我必须直接输入c(jack, jill) 而不是使用two_names 变量,这将达不到目的。是否有一些类似的程序可以直接使用two_names?此答案How to pass a named vector to dplyr::select using quosures? 使用rlang::syms,但尽管这适用于选择变量(即stackdf %>% select(!!! rlang::syms(two_names)),但它似乎不适用于在变异时提供参数(即stackdf %>% rowwise %>% mutate(test = anyNA(!!! rlang::syms(two_names)))。此答案类似但不起作用:How to evaluate a constructed string with non-standard evaluation using dplyr?
【问题讨论】:
标签: r dplyr rlang nse standard-evaluation