我正在尝试使用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
只能接受一个对象,因此无法正常工作。这里的问题类似于:在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)))
)。这个答案类似但不起作用:How to evaluate a constructed string with non-standard evaluation using dplyr?
list()
函数似乎可以工作,但我不清楚为什么as.list
和list
在这里有不同的行为。 - Brandonc
;!!!
将它们拼接为单独的参数,因此第二个参数被传递到anyNA
的recursive
参数中,这是不正确的。 - alistairerowwise
?mutate
不是已经逐行操作了吗? - JelenaČuklina+
返回一个向量,但sum
将所有内容折叠成单个数字(就像这里的anyNA
一样,因此如果没有rowwise
,它将返回单个TRUE
,而mutate
将将其循环利用到列中)。总是有替代方案来代替rowwise
(现在已经不鼓励使用了),但它们通常需要更深入的函数群和对函数式编程的理解。 - alistaire