我正在尝试使用dplyr::coalesce()
中列名的变量使用一组列中的第一个NA值创建一个新列。如何运作?
我尝试使用带有实际列名的coalesce(),它可以工作。将变量传递给它时,它会失败。
tb <- tibble(a = c("a", NA, "a", NA, "a"),
b = c(NA, "b", NA, NA, NA),
c = c('c', 'c', 'c', 'c', NA))
df <- tb %>%
mutate(combined = coalesce(a, b, c))
这适用于以下输出
# A tibble: 5 x 4
a b c combined
<chr> <chr> <chr> <chr>
1 a NA c a
2 NA b c b
3 a NA c a
4 NA NA c c
5 a NA NA a
但是,当我为列名称创建变量时:
uCols <- c("a", "b", "c")
并运行类似的代码:
df <- tb %>%
mutate(combined = coalesce(uCols))
我收到以下错误:
Error: Column `combined` must be length 5 (the number of rows) or one, not 3
我尝试使用enexprs(uCols)
,但这不起作用。
如何将uCols
变量传递给coalesce()
,以使其按需工作?
答案 0 :(得分:0)
一种选择是将字符串转换为符号(syms
中的符号{rlang
),然后求值(!!!
)
library(dplyr)
tb %>%
mutate(combined = coalesce(!!! rlang::syms(uCols)))
# A tibble: 5 x 4
# a b c combined
# <chr> <chr> <chr> <chr>
#1 a <NA> c a
#2 <NA> b c b
#3 a <NA> c a
#4 <NA> <NA> c c
#5 a <NA> <NA> a
或者另一个选择是do.call
tb %>%
mutate(combined = select(., uCols) %>%
do.call(coalesce, .))