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