Estoy tratando de reemplazar ciertos valores en un marco de datos basado en una coincidencia con otro marco de datos.

df1 <- data.frame("round" = c(1,1,1,2,2,2,3,3,3),
              'geocode' = c('AAA', 'BBB', 'CCC', 'AAA', 'BBB', 'CCC', 'AAA', 'BBB', 'CCC'),
              'value1' = c(111, 222, 333, NA, NA, NA, 777, 888, 999))

df2 <- data.frame('geocode' = c('AAA', 'BBB', 'CCC'), 'value2' = c(444, 555, 666))

Salida deseada:

out.df <- data.frame("round" = c(1,1,1,2,2,2,3,3,3),
                 'geocode' = c('AAA', 'BBB', 'CCC', 'AAA', 'BBB', 'CCC', 'AAA', 'BBB', 'CCC'),
                 'value1' = c(111, 222, 333, 444, 555, 666, 777, 888, 999))

Mi intento de solución:

df1[df1$round == 2, 'value1'] <- df2$value2[match(df1$geocode, df2$geocode)]

Parece que no puedo evitar el hecho de que los dos marcos de datos tienen un número diferente de filas.

0
a_wise 23 ene. 2018 a las 16:28

3 respuestas

La mejor respuesta

Perdiste una condición

df1[df1$round == 2, 'value1'] <- df2$value2[match(df1[df1$round == 2, 'geocode'], df2$geocode)]
1
Terru_theTerror 23 ene. 2018 a las 13:34

¿Qué tal esto?

library(plyr)
df=join(df1,df2,by="geocode",type="left")
df[is.na(df$value1),]$value1=df[is.na(df$value1),]$value2
0
Antonis 23 ene. 2018 a las 13:41

Parece que solo desea reemplazar el NA en su df1$value1. En ese caso, debe especificar esta condición, es decir

df1$value1[is.na(df1$value1)] <- df2$value2[match(df1$geocode, df2$geocode)][is.na(df1$value1)]
1
Sotos 23 ene. 2018 a las 13:37
48402913