3 votes

Passer une chaîne comme nom de variable dans dplyr::coalesce

J'essaie de créer une nouvelle colonne avec la première valeur NA d'un ensemble de colonnes en utilisant une variable pour les noms de colonnes dans dplyr::coalesce() . Comment le faire fonctionner ?

J'ai essayé d'utiliser coalesce() avec les noms de colonnes réels et cela fonctionne. Il échoue lorsque je lui passe une variable.

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))

Cela fonctionne avec le résultat suivant

# 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 

Cependant, lorsque je crée une variable pour les noms de colonnes :

uCols <- c("a", "b", "c")

et exécuter un code similaire :

df <- tb %>%
  mutate(combined = coalesce(uCols))

J'obtiens l'erreur suivante :

Error: Column `combined` must be length 5 (the number of rows) or one, not 3

J'ai essayé d'utiliser enexprs(uCols) mais cela ne fonctionne pas.

Comment passer le uCols à la variable coalesce() pour qu'il fonctionne comme prévu ?

1voto

akrun Points 148302

Une option consisterait à convertir les chaînes de caractères en symboles ( syms de rlang ), puis évaluer ( !!! )

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       

Une autre option consiste à do.call

tb %>%
   mutate(combined = select(., uCols) %>% 
                          do.call(coalesce, .))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X