valores valor vacios studio seleccionar reemplazar quitar perdidos filas eliminar con r dataframe apply mean

vacios - Encuentre y reemplace los valores faltantes con la media de la fila



valor na en r (5)

Tengo un marco de datos con NA y quiero reemplazar las NA con medios de fila

c1 = c(1,2,3,NA) c2 = c(3,1,NA,3) c3 = c(2,1,3,1) df = data.frame(c1,c2,c3) > df c1 c2 c3 1 1 3 2 2 2 1 1 3 3 NA 3 4 NA 3 1

así que eso

> df c1 c2 c3 1 1 3 2 2 2 1 1 3 3 3 3 4 2 3 1


Creo que esto funciona,

df[which(is.na(df), arr.ind=TRUE)] <- rowMeans(df[!complete.cases(df), ], na.rm=TRUE)


Mi solución es

rwmns = rowMeans(df,na.rm=TRUE) df$c1[is.na(df$c1)] = rwmns[is.na(df$c1)] df$c2[is.na(df$c2)] = rwmns[is.na(df$c2)] df$c3[is.na(df$c3)] = rwmns[is.na(df$c3)] > df c1 c2 c3 1 1 3 2 2 2 1 1 3 3 3 3 4 2 3 1

¿Hay una manera más elegante, especialmente cuando alguien tiene muchas columnas?


Muy similar a la respuesta de @ baptiste

> ind <- which(is.na(df), arr.ind=TRUE) > df[ind] <- rowMeans(df, na.rm = TRUE)[ind[,1]]


Usando apply (tenga en cuenta que el objeto devuelto es una matrix ):

t( apply( df , 1 , function(x) { x[ is.na(x) ] = mean( x , na.rm = TRUE ); x } ) ) c1 c2 c3 [1,] 1 3 2 [2,] 2 1 1 [3,] 3 3 3 [4,] 2 3 1

Usamos cualquier función anónima para cambiar los valores de cada NA en cada fila al mean de esa fila. La única ventaja es que no tiene que escribir más si aumenta el número de filas. No es particularmente eficiente o rápido en un sentido computacional, pero más aún en un sentido cognitivo (no lo notarás a menos que tengas 000,000 de filas).


Otra opción es na.aggregate from library(zoo) después de transponer el conjunto de datos

library(zoo) df[] <- t(na.aggregate(t(df))) df # c1 c2 c3 #1 1 3 2 #2 2 1 1 #3 3 3 3 #4 2 3 1