Tengo un marco de datos y algunas columnas tienen NAvalores.
¿Cómo reemplazo estos NAvalores 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
normpaquete. Tiene muchas características agradables para el análisis de datos faltantes. =)fuente
df[19:28][is.na(df[19:28])] <- 0Las 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)] <- 0opció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.tablees 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_nase 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
mutateesummarize_aty_allvariantes 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.tablefunciones 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])] = 0está mal, debería serdf1[[j]][is.na(df1[[j]])] = 0forLp_Sbstno parece ser una forma de que nadie debe tener en cuenta que se acerca vsforLp_smplfSbstcoalesce()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
applya 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.naes una función genérica y tiene métodos para objetos dedata.frameclase. así que este también funcionará endata.frames!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
NAs 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
dplyr0.5.0, puede usar lacoalescefunción que se puede integrar fácilmente en la%>%tubería haciendocoalesce(vec, 0). Esto reemplaza todos los NAveccon 0:Digamos que tenemos un marco de datos con
NAs:fuente
Enfoque más general del uso
replace()en matriz o vector para reemplazarNAa0Por ejemplo:
Esta es también una alternativa al uso
ifelse()endplyrfuente
levels(A$x) <- append(levels(A$x), "notAnswered") A$x <- replace(A$x,which(is.na(A$x)),"notAnswered")whichno es necesario aquí, puedes usarlox1 <- replace(x,is.na(x),1).NAa0en 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_eachyreplacecuidar de laNAde0reemplazo. 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
NAs 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
dplyropción compatible con tubería contidyrmétodoreplace_naque 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.tableversión recientefuente
Esta simple función extraída de Datacamp podría ayudar:
Entonces
fuente
Una manera fácil de escribirlo es
if_nadesdehablar: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