2011-08-02 9 views
9

quiero reemplazar mis valores NA partir de una matriz adquirida por:Reemplazar los valores de NA por fila significa

read.table(…) 

Esos valores deben ser la media de la fila correspondiente.

es decir, la siguiente fila de la tabla:

1 2 1 NA 2 1 1 2 

se convertiría en

1 2 1 1.43 2 1 2 

Gracias.

+2

¿Por qué querrías hacer esto * en fila *? El simple hecho de comprobar que no está mezclando variables con objetos/muestras. Por lo general, uno hace esta columna, calcula la media de cada variable y la usa para reemplazar 'NA 'dentro de la variable. –

+0

Además, 'read.table()' devuelve un data.frame. ¿Estás hablando de un marco de datos o una matriz adecuada? –

+0

@GavinSimpson Una razón para esto sería en los datos del cuestionario con preguntas repetidas para su uso en una medición. Los medios de las otras preguntas se usarían para sustituir los datos faltantes. – Irwin

Respuesta

5
x[is.na(x)] <- mean(x, na.rm=TRUE) # for vectors or for a matrix as a whole 

t(apply(x, 1, function(xv) { xv[is.na(xv)] <- 
            mean(xv, na.rm=TRUE) 
           return(xv)} 
     )) # for a row-oriented sol'n 
+3

¿No devolvería esto la media de toda la matriz? –

+0

Sería. No entendí que quería una solución orientada a filas, pero pondré una. –

1
a = c(NA, 1, 2, 3, 10) 
a[which(is.na(a)==TRUE)] = mean(a,na.rm = T) 
+2

Esto debería funcionar, pero es innecesariamente complicado. is.na (a) devuelve un vector de Booleanos, por lo que == TRUE es redundante. 'which' tampoco es necesario, ya que puede indexar vectores por un vector de longitud <=' length (a) 'o por un vector de longitud' length (a) 'que contenga TRUEs y FALSEs (o 0/1's que obtengan coaccionado a VERDADERO/FALSO). Finalmente, evite usar T y F para VERDADERO y FALSO, ya que pueden sobreescribirse. –

+0

Considere más, el aspecto de formación: d – user702846

+0

Para una matriz, el mismo problema, toma la media de todo y reemplaza. –

21

He aquí algunos datos de la muestra.

m <- matrix(1:16, nrow=4) 
m[c(1,4,6,11,16)] <- NA 

Y así es como me llene en missings con los medios de fila.

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

Sus datos estarán en un data.frame; primero deberá convertir a una matriz usando as.matrix. Puede o no querer dejarlo en ese formato; para convertir el uso posterior as.data.frame.

+1

+1 Ese es el ticket. – joran

+0

Gracias. Aparece el siguiente mensaje de error con el código: Error en '[<-. Data.frame' (' * tmp * ', k, value = c (3.67857142857143, 3.34375,: solo se permiten subíndices de matriz lógica en reemplazo – Delphine

+1

Primero haga que su marco de datos entre en una matriz ('as.matrix'), luego hágalo, luego conviértalo de nuevo (' as.data.frame'). – Aaron

Cuestiones relacionadas