Tengo un marco de datos y algunas columnas tienen NA
valores.
¿Cómo reemplazo estos NA
valores con ceros?
r
dataframe
na
missing-data
imputation
Renato Dinhani
fuente
fuente
Respuestas:
Vea mi comentario en la respuesta @ gsk3. Un simple ejemplo:
No hay necesidad de aplicar
apply
. =)EDITAR
También deberías echar un vistazo al
norm
paquete. Tiene muchas características agradables para el análisis de datos faltantes. =)fuente
df[19:28][is.na(df[19:28])] <- 0
Las opciones hibridadas dplyr ahora son alrededor de un 30% más rápidas que las reasignaciones del subconjunto Base R. En un marco de datos de punto de datos de 100M
mutate_all(~replace(., is.na(.), 0))
ejecuta medio segundo más rápido que lad[is.na(d)] <- 0
opción base R. Lo que uno quiere evitar específicamente es usar unifelse()
o unif_else()
. (El análisis completo de 600 ensayos duró más de 4.5 horas debido principalmente a la inclusión de estos enfoques). Consulte los análisis de referencia a continuación para obtener los resultados completos.Si está luchando con marcos de datos masivos,
data.table
es la opción más rápida de todas: 40% más rápido que el enfoque estándar de Base R. También modifica los datos en el lugar, lo que le permite trabajar con casi el doble de datos a la vez.Una agrupación de otros enfoques útiles de reemplazo tidyverse
Localmente:
mutate_at(c(5:10), ~replace(., is.na(.), 0))
mutate_at(vars(var5:var10), ~replace(., is.na(.), 0))
mutate_at(vars(contains("1")), ~replace(., is.na(.), 0))
contains()
, tratarends_with()
,starts_with()
mutate_at(vars(matches("\\d{2}")), ~replace(., is.na(.), 0))
Condicionalmente:
(cambie solo un tipo y deje otros tipos solos).
mutate_if(is.integer, ~replace(., is.na(.), 0))
mutate_if(is.numeric, ~replace(., is.na(.), 0))
mutate_if(is.character, ~replace(., is.na(.), 0))
El análisis completo
Actualizado para dplyr 0.8.0: las funciones usan
~
símbolos de formato purrr : reemplazandofuns()
argumentos obsoletos .Enfoques probados:
El código para este análisis:
Resumen de Resultados
Diagrama de caja de resultados
Diagrama de dispersión codificado por color de ensayos (con eje y en una escala logarítmica)
Una nota sobre los otros artistas de alto rendimiento.
Cuando los conjuntos de datos se hacen más grandes, Tidyr '' s
replace_na
se habían retirado históricamente hacia el frente. Con la colección actual de 100M puntos de datos para ejecutar, funciona casi exactamente tan bien como una Base R For Loop. Tengo curiosidad por ver qué sucede con los marcos de datos de diferentes tamaños.Ejemplos adicionales para la
mutate
esummarize
_at
y_all
variantes de función se pueden encontrar aquí: https://rdrr.io/cran/dplyr/man/summarise_all.html Además, encontré manifestaciones votos y colecciones de ejemplos aquí: https: //blog.exploratory. io / dplyr-0-5-is-awesome-heres-why-be095fd4eb8aAtribuciones y apreciaciones
Con especial agradecimiento a:
local()
, y (con la ayuda del paciente de Frank, también) el papel que juega la coerción silenciosa en acelerar muchos de estos enfoques.coalesce()
función más nueva y actualice el análisis.data.table
funciones lo suficientemente bien como para finalmente incluirlas en la alineación.is.numeric()
realmente prueba.(Por supuesto, comuníquese y deles votos positivos también si considera que esos enfoques son útiles).
Nota sobre mi uso de Numerics: si tiene un conjunto de datos entero puro, todas sus funciones se ejecutarán más rápido. Consulte el trabajo de alexiz_laz para obtener más información. IRL, no recuerdo haber encontrado un conjunto de datos que contiene más del 10-15% de enteros, por lo que estoy ejecutando estas pruebas en marcos de datos totalmente numéricos.
Hardware utilizado CPU de 3.9 GHz con 24 GB de RAM
fuente
df1[j][is.na(df1[j])] = 0
está mal, debería serdf1[[j]][is.na(df1[[j]])] = 0
forLp_Sbst
no parece ser una forma de que nadie debe tener en cuenta que se acerca vsforLp_smplfSbst
coalesce()
opción y la volví a ejecutar todas las veces. Gracias por el empujón para actualizar.Para un solo vector:
Para un data.frame, haga una función de lo anterior, luego
apply
a las columnas.Proporcione un ejemplo reproducible la próxima vez como se detalla aquí:
¿Cómo hacer un gran ejemplo reproducible de R?
fuente
is.na
es una función genérica y tiene métodos para objetos dedata.frame
clase. así que este también funcionará endata.frame
s!methods(is.na)
por primera vez, estaba como whaaa?!? . ¡Me encanta cuando suceden cosas así! =)Ejemplo de dplyr:
Nota: Estos trabajos por columna seleccionada, si tenemos que hacer esto para toda la columna, ver @reidjax 's respuesta usando mutate_each .
fuente
Si intentamos reemplazar
NA
s al exportar, por ejemplo al escribir en csv, entonces podemos usar:fuente
Sé que la pregunta ya está respondida, pero hacerlo de esta manera podría ser más útil para algunos:
Defina esta función:
Ahora, siempre que necesite convertir NA en un vector a cero, puede hacer:
fuente
Con
dplyr
0.5.0, puede usar lacoalesce
función que se puede integrar fácilmente en la%>%
tubería haciendocoalesce(vec, 0)
. Esto reemplaza todos los NAvec
con 0:Digamos que tenemos un marco de datos con
NA
s:fuente
Enfoque más general del uso
replace()
en matriz o vector para reemplazarNA
a0
Por ejemplo:
Esta es también una alternativa al uso
ifelse()
endplyr
fuente
levels(A$x) <- append(levels(A$x), "notAnswered") A$x <- replace(A$x,which(is.na(A$x)),"notAnswered")
which
no es necesario aquí, puedes usarlox1 <- replace(x,is.na(x),1)
.NA
a0
en sólo una columna específica de una trama de datos grande y esta funciónreplace()
trabajado la manera más eficaz a la vez que el más simple.También es posible de usar
tidyr::replace_na
.fuente
Otro ejemplo usando el paquete imputeTS :
fuente
Si desea reemplazar los NA en las variables de factor, esto podría ser útil:
Transforma un vector factorial en un vector numérico y agrega otro nivel de factor numérico artificial, que luego se transforma de nuevo en un vector factorial con un "nivel NA" adicional de su elección.
fuente
Hubiera comentado en la publicación de @ ianmunoz pero no tengo suficiente reputación. Se pueden combinar
dplyr
'smutate_each
yreplace
cuidar de laNA
de0
reemplazo. Usando el marco de datos de la respuesta de @ aL3xa ...Aquí estamos utilizando la evaluación estándar (SE), por lo que necesitamos el guión bajo en "
funs_
." También usamoslazyeval
'sinterp
/~
y las.
referencias "todo con lo que estamos trabajando", es decir, el marco de datos. ¡Ahora hay ceros!fuente
Puedes usar
replace()
Por ejemplo:
fuente
NA
s en su vector. Está bien para vectores pequeños como en su ejemplo.x1 <- replace(x,is.na(x),1)
funcionará sin enumerar explícitamente los valores del índice.Otra
dplyr
opción compatible con tubería contidyr
métodoreplace_na
que funciona para varias columnas:Puede restringir fácilmente, por ejemplo, a las columnas numéricas:
fuente
La función dedicada (
nafill
/setnafill
) para ese propósito está en ladata.table
versión recientefuente
Esta simple función extraída de Datacamp podría ayudar:
Entonces
fuente
Una manera fácil de escribirlo es
if_na
desdehablar
:que devuelve:
fuente
Para reemplazar todas las NA en un marco de datos, puede usar:
df %>% replace(is.na(.), 0)
fuente
si desea asignar un nuevo nombre después de cambiar los NA en una columna específica en este caso la columna V3, use también puede hacer esto
fuente