0
votes

Fusionner deux colonnes contenant des valeurs NA dans des lignes complémentaires

Supposons que j'ai ce Dataframe xxx

qui ressemble à ceci xxx

Comment puis-je fusionner les deux colonnes en une? Fondamentalement, les valeurs NA sont dans des rangées complémentaires. Il serait bien d'obtenir également (dans le processus) un drapeau drapeau contenant 0 si l'entrée provient de x et 1 < / code> si l'entrée provient de y .


0 commentaires

3 Réponses :


3
votes

Nous pouvons essayer d'utiliser la fonction coalesce du package dplyr :

df$merged <- coalesce(df$x, df$y)
df$flag <- ifelse(is.na(df$y), 0, 1)
df

   x  y merged flag
1  1 NA      1    0
2 NA  2      2    1
3 NA  3      3    1
4  4 NA      4    0
5  5 NA      5    0
6 NA  6      6    1


1 commentaires

La fusion de @Euler_Salter Dplyr est probablement empruntée à la fonction de fusion SQL, qui est utilisée depuis plus de 30 ans.



0
votes

Vous pouvez le faire en utilisant dplyr comme suit:

library(dplyr)

# Creating dataframe
df <- 
  data.frame(
    x = c(1, NA, NA, 4, 5, NA),
    y = c(NA, 2, 3, NA, NA, 6))

df %>%
  # If x is null then replace it with y
  mutate(merged = coalesce(x, y),
         # If x is null then put 1 else put 0
         flag = if_else(is.na(x), 1, 0))

# x  y merged flag
# 1 NA      1    0
# NA  2      2    1
# NA  3      3    1
# 4 NA      4    0
# 5 NA      5    0
# NA  6      6    1


2 commentaires

Vous n'avez pas vraiment le if_else () car is.na (x) est TRUE et vous pouvez le convertir en 1.


Oui, c'est vrai, mais en général, je pense que l'utilisation de if_else est une meilleure pratique car en général, elle est plus stricte et rend la sortie beaucoup plus prévisible lors de la lecture du code.



1
votes

Nous pouvons également utiliser les méthodes base R avec max.col sur la matrice logique pour obtenir l'index de la colonne, cbind avec l'index de ligne et extraire les valeurs qui ne sont pas NA

library(data.table)
setDT(df)[, c('merged', 'flag' ) := .(fcoalesce(x, y), +(!is.na(y)))]
df
#    x  y merged flag
#1:  1 NA      1    0
#2: NA  2      2    1
#3: NA  3      3    1
#4:  4 NA      4    0
#5:  5 NA      5    0
#6: NA  6      6    1

Ou nous pouvons utiliser fcoalesce de data.table qui est écrit en C et est multithread pour les types numériques et factoriels.

df$merged <- df[cbind(seq_len(nrow(df)), max.col(!is.na(df)))]
df$flag <- +(!is.na(df$y))
df
#   x  y merged flag
#1  1 NA      1    0
#2 NA  2      2    1
#3 NA  3      3    1
#4  4 NA      4    0
#5  5 NA      5    0
#6 NA  6      6    1


0 commentaires