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.
3 respuestas
Perdiste una condición
df1[df1$round == 2, 'value1'] <- df2$value2[match(df1[df1$round == 2, 'geocode'], df2$geocode)]
¿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
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)]
Preguntas relacionadas
Nuevas preguntas
r
R es un entorno de software y lenguaje de programación de código abierto y gratuito para computación estadística, bioinformática, visualización y computación en general. Proporcione ejemplos mínimos y reproducibles junto con el resultado deseado. Use dput () para los datos y especifique todos los paquetes no base con llamadas a library (). No incruste imágenes para datos o código, use bloques de código con sangría en su lugar. Para preguntas relacionadas con estadísticas, use https://stats.stackexchange.com.