Supposons que j'ai ce Dataframe qui ressemble à ceci p> 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 code> contenant
0 code> si l'entrée provient de
x code> et
1 < / code> si l'entrée provient de
y code>. p> p>
3 Réponses :
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
La fusion
de @Euler_Salter Dplyr est probablement empruntée à la fonction de fusion SQL, qui est utilisée depuis plus de 30 ans.
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
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.
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