Voici une option dans base R
. Convertissez les données en une matrice logique avec TRUE pour non-NA et FALSE pour NA. Reproduisez les noms des colonnes en vous basant sur le col
indice um ('nm1'). Attribuez aux éléments des données basées sur l'indice 'i1' les noms de colonnes correspondants.
i1 <- !is.na(dfABy)
nm1 <- names(dfABy)[col(dfABy)]
dfABy[i1] <- nm1[i1]
-sortie
dfABy
# A B C
#1 A <NA> <NA>
#2 <NA> B <NA>
#3 <NA> B <NA>
#4 A <NA> C
#5 <NA> B C
Ou en une seule ligne
dfABy[] <- names(dfABy)[col(dfABy)][(NA^is.na(dfABy)) * col(dfABy)]
Ou en utilisant tidyverse
library(dplyr)
dfABy %>%
mutate(across(everything(), ~ replace(., !is.na(.), cur_column())))
# A B C
#1 A <NA> <NA>
#2 <NA> B <NA>
#3 <NA> B <NA>
#4 A <NA> C
#5 <NA> B C
données
dfABy <- structure(list(A = c(56L, NA, NA, 67L, NA), B = c(NA, 45L, 77L,
NA, 65L), C = c(NA, NA, NA, 12L, 3L)), class = "data.frame", row.names = c(NA,
-5L))