2011-08-02 20 views
9

voglio sostituire miei valori NA da una matrice acquisita da:Sostituire valori NA per riga significa

read.table(…) 

Questi valori dovrebbero essere la media della riga corrispondente.

cioè, la seguente riga della tabella:

1 2 1 NA 2 1 1 2 

sarebbe diventato

1 2 1 1.43 2 1 2 

Grazie.

+2

Perché si desidera eseguire questo * riga-saggio *? Basta controllare che non si confondano le variabili con oggetti/campioni. Di solito uno fa questo in termini di colonne, calcolando la media per ogni variabile e usando quello per sostituire 'NA' all'interno della variabile. –

+0

Inoltre, 'read.table()' restituisce un data.frame. Stai parlando di un frame di dati o di una matrice appropriata? –

+0

@GavinSimpson Una ragione per questo sarebbe nei dati del questionario con domande ripetute per l'uso in una misurazione. I mezzi delle altre domande sarebbero usati per sostituire i dati mancanti. – Irwin

risposta

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

Non restituirebbe la media dell'intera matrice? –

+0

Lo farebbe. Non ho capito che voleva una soluzione orientata alle file, ma ne inserirà una. –

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

Questo dovrebbe funzionare, ma è inutilmente complicato. is.na (a) restituisce un vettore di booleani, quindi == VERO è ridondante. 'which' non è necessario neanche, dato che puoi indicizzare i vettori con un vettore di lunghezza <=' length (a) 'o con un vettore di lunghezza' length (a) 'contenente TRUE e FALSE (o 0/1 che ottengono costretto a VERO/FALSO). Infine, evita di usare T e F per TRUE e FALSE, poiché possono essere sovrascritti. –

+0

Ho considerato di più l'aspetto dell'allenamento: d – user702846

+0

Per una matrice, lo stesso problema, prende la media di tutto e sostituisce. –

21

Ecco alcuni dati di esempio.

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

Ed ecco come mi piacerebbe riempire in missings con i mezzi di fila.

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

I Suoi dati saranno in data.frame; dovrai prima convertire in una matrice usando as.matrix. Puoi o non vuoi lasciarlo in quel formato; per riconvertire utilizzare as.data.frame.

+1

+1 Questo è il biglietto – joran

+0

Grazie. Viene visualizzato il seguente messaggio di errore utilizzando il codice: Errore in '[<-. Data.frame' (' * tmp * ', k, valore = c (3.67857142857143, 3.34375,: sono consentiti solo gli indici di matrice logica nella sostituzione – Delphine

+1

Prima creare il frame di dati in una matrice ('as.matrix'), quindi eseguirlo, quindi riconvertire (' as.data.frame'). – Aaron

Problemi correlati