2 votes

Attribuer le nom de la variable à une variable non NA dans un cadre de données avec plusieurs variables

Par exemple, mon df est :

         >dfABy 
         A    B     C

         56   NA  NA
         NA   45  NA
         NA   77  NA 
         67   NA  12 
         NA   65  3

Je veux obtenir le cadre de données suivant

         >dfABy 
         A    B    C

         A    NA  NA
         NA   B   NA
         NA   B   NA 
         A    NA  C
         NA   B   C

1voto

akrun Points 148302

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

1voto

nyk Points 617

L'autre alternative est d'utiliser le purrr paquet :

library(purrr)

df <- data.frame(A = c(56, NA, NA, 67, NA), B = c(NA, 45, 77, NA, 65), C = c(NA, NA, NA,12, 3))

imap_dfc(df, ~ifelse(is.na(.x), NA, .y))
# A tibble: 5 x 3
  A     B     C    
  <chr> <chr> <chr>
1 A     NA    NA   
2 NA    B     NA   
3 NA    B     NA   
4 A     NA    C    
5 NA    B     C

0voto

Ronak Shah Points 24715

Option de base R avec Map :

dfABy[] <- Map(function(x, y) ifelse(is.na(x), NA, y), dfABy, names(dfABy))
dfABy

#     A    B    C
#1    A <NA> <NA>
#2 <NA>    B <NA>
#3 <NA>    B <NA>
#4    A <NA>    C
#5 <NA>    B    C

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