我正在尝试为使用包的mutate()
调用提供一个包含多个列名的向量。dplyr
下面的可重现示例:
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
向量?Usingas.name
只需要一个对象,所以它不起作用。
这里的问题类似:将变量名向量传递给 dplyr 中的arrange()。该解决方案“有效”,因为我可以使用以下代码:
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)))
。这个答案是相似的但不起作用:如何使用 dplyr 评估具有非标准评估的构造字符串?