Tengo regularmente situaciones en las que necesito reemplazar valores faltantes de un data.frame con valores de algún otro data.frame que está en un nivel diferente de agregación . Entonces, por ejemplo, si tengo un data.frame lleno de datos del condado, podría reemplazar los valores de NA con los valores de estado almacenados en otro data.frame. Después de escribir el mismo merge
... ifelse(is.na())
yada yada unas pocas docenas de veces, decidí analizar y escribir una función para hacer esto.Crear una función para reemplazar NA de un data.frame con valores de otro
Esto es lo que cociné, junto con un ejemplo de cómo lo uso:
fillNaDf <- function(naDf, fillDf, mergeCols, fillCols){
mergedDf <- merge(naDf, fillDf, by=mergeCols)
for (col in fillCols){
colWithNas <- mergedDf[[paste(col, "x", sep=".")]]
colWithOutNas <- mergedDf[[paste(col, "y", sep=".")]]
k <- which(is.na(colWithNas))
colWithNas[k] <- colWithOutNas[k]
mergedDf[col] <- colWithNas
mergedDf[[paste(col, "x", sep=".")]] <- NULL
mergedDf[[paste(col, "y", sep=".")]] <- NULL
}
return(mergedDf)
}
## test case
fillDf <- data.frame(a = c(1,2,1,2), b = c(3,3,4,4) ,f = c(100,200, 300, 400), g = c(11, 12, 13, 14))
naDf <- data.frame(a = sample(c(1,2), 100, rep=TRUE), b = sample(c(3,4), 100, rep=TRUE), f = sample(c(0,NA), 100, rep=TRUE), g = sample(c(0,NA), 200, rep=TRUE))
fillNaDf(naDf, fillDf, mergeCols=c("a","b"), fillCols=c("f","g"))
Así que después de que consiguiera este espectáculo de correr tuve esta extraña sensación de que alguien probablemente ha resuelto este problema antes de mí y en una una forma mucho más elegante. ¿Hay una solución mejor/más fácil/más rápida para este problema? Además, ¿hay alguna manera de eliminar el bucle en el medio de mi función? Ese ciclo está ahí porque a menudo estoy reemplazando NA en más de una columna. Y, sí, la función asume que las columnas que estamos rellenando de tienen el mismo nombre y las columnas que estamos rellenando en, y lo mismo se aplica a la fusión.
Cualquier orientación o refactorización sería útil.
EDITAR el 2 dic me di cuenta que tenía defectos lógicos en mi ejemplo, que me fijo.
fresca. Algunos comentarios pueden ayudarme a darle sentido. ¡Parece conciso! :) –
OK - Lo comenté un poco. Si está interesado en obtener más información, la sección 'Ejemplos' de '? Data.table' es ejemplar, y vale la pena los ~ 20 minutos que tarda en procesarse. Especialmente si usted es un tipo de Big Data, y parece que podría ser, realmente podría valer la pena la inversión de tiempo inicial. –
Gracias Josh.Eso es realmente útil. –