66 votes

Fusionner des dataframes inégaux et remplacer les lignes manquantes par 0

J'ai deux data.frames, l'un avec uniquement des caractères et l'autre avec des caractères et des valeurs.

 df1 = data.frame(x=c('a', 'b', 'c', 'd', 'e'))
df2 = data.frame(x=c('a', 'b', 'c'),y = c(0,1,0))
merge(df1, df2)
  x y
1 a 0
2 b 1
3 c 0 

Je veux fusionner df1 et df2. Les caractères a, b et c ont bien fusionné et ont également 0, 1, 0 mais d et e n'ont rien. Je veux d et e également dans la table de fusion, avec la condition 0 0. Ainsi, pour chaque ligne manquante dans le df2 data.frame, le 0 doit être placé dans la table df1, comme :

   x y
1 a 0
2 b 1
3 c 0
4 d 0
5 e 0

7voto

Nick Sabbe Points 6741

Ou, comme alternative au code de @Chase, étant un fan récent de plir avec une formation en bases de données :

 require(plyr)
zz<-join(df1, df2, type="left")
zz[is.na(zz)] <- 0

4voto

Wojciech Sobala Points 2950

Une autre alternative avec data.table.

EXEMPLE DE DONNÉES

 dt1 <- data.table(df1)
dt2 <- data.table(df2)
setkey(dt1,x)
setkey(dt2,x)

CODE

 dt2[dt1,list(y=ifelse(is.na(y),0,y))]

2voto

sbha Points 1948

En supposant que df1 a toutes les valeurs de x d'intérêt, vous pouvez utiliser un dplyr::left_join() pour fusionner, puis un base::replace() ou tidyr::replace_na() pour remplacer les NA s par des 0 s :

 library(tidyverse)

# dplyr only:
df_new <- 
  left_join(df1, df2, by = 'x') %>% 
  mutate(y = replace(y, is.na(y), 0))

# dplyr and tidyr:
df_new <- 
  left_join(df1, df2, by = 'x') %>% 
  mutate(y = replace_na(y, 0))

# In the sample data column `x` is a factor, which will give a warning with the join. This can be prevented by converting to a character before the join:
df_new <- 
  left_join(df1 %>% mutate(x = as.character(x)), 
            df2 %>% mutate(x = as.character(x)), 
            by = 'x') %>% 
    mutate(y = replace(y, is.na(y), 0))

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