Передайте строку как имя переменной в dplyr :: coalesce - PullRequest
2 голосов
/ 18 мая 2019

Я пытаюсь создать новый столбец с первым значением NA из набора столбцов, используя переменную для имен столбцов в dplyr::coalesce().Как заставить это работать?

Я попытался использовать 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(), чтобы она работала как нужно?

1 Ответ

1 голос
/ 18 мая 2019

Можно было бы преобразовать строки в символы (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, .))
...