2012-02-28 25 views
21

Vorrei ottenere la media per determinate colonne per ogni riga.Come posso ottenere la media (media) delle colonne selezionate

devo questi dati:

w=c(5,6,7,8) 
x=c(1,2,3,4) 
y=c(1,2,3) 
length(y)=4 
z=data.frame(w,x,y) 

che restituisce:

w x y 
1 5 1 1 
2 6 2 2 
3 7 3 3 
4 8 4 NA 

vorrei ottenere la media per determinate colonne, non tutti di loro. Il mio problema è che ci sono un sacco di NA nei miei dati. Quindi, se ho voluto la media di X e Y, questo è ciò che vorrei tornare:

w x y mean 
1 5 1 1 1 
2 6 2 2 2 
3 7 3 3 3 
4 8 4 NA 4 

Credo che avrei potuto fare qualcosa di simile z$mean=z$x+z$y/2 ma l'ultima riga per Y è NA così ovviamente non voglio l'AN da calcolare e non dovrei dividermi per due. Ho provato cumsum ma questo restituisce NA quando c'è una sola NA in quella riga. Immagino di dover cercare qualcosa che aggiunga le colonne selezionate, ignori le NA, ottenga il numero di colonne selezionate che non hanno NA e dividono per quel numero. Ho provato ?? media e ?? media e sono completamente perplesso.

ETA: C'è anche un modo per aggiungere un peso a una colonna specifica?

risposta

31

ecco alcuni esempi:

> z$mean <- rowMeans(subset(z, select = c(x, y)), na.rm = TRUE) 
> z 
    w x y mean 
1 5 1 1 1 
2 6 2 2 2 
3 7 3 3 3 
4 8 4 NA 4 

medio ponderato

> z$y <- rev(z$y) 
> z 
    w x y mean 
1 5 1 NA 1 
2 6 2 3 2 
3 7 3 2 3 
4 8 4 1 4 
> 
> weight <- c(1, 2) # x * 1/3 + y * 2/3 
> z$wmean <- apply(subset(z, select = c(x, y)), 1, function(d) weighted.mean(d, weight, na.rm = TRUE)) 
> z 
    w x y mean wmean 
1 5 1 NA 1 1.000000 
2 6 2 3 2 2.666667 
3 7 3 2 3 2.333333 
4 8 4 1 4 2.000000 
+1

Grazie, questo è esattamente quello che sto cercando. Ho davvero bisogno di studiare questo magico comando di applicare, sembra che sia una soluzione a tutto. – thequerist

17

Provare a utilizzare rowMeans:

z$mean=rowMeans(z[,c("x", "y")], na.rm=TRUE) 

    w x y mean 
1 5 1 1 1 
2 6 2 2 2 
3 7 3 3 3 
4 8 4 NA 4 
+0

+1 Grazie, normalmente uso Extract, non posso credere di non aver pensato a questo. Ho dato l'assegno a kohske per includere anche la soluzione ponderata. – thequerist

+0

@andrew Come posso ottenere rowMeans di un intervallo di colonne con un nome particolare (ad es. MGW.1, MGW.2, MGW.3 ... MGW.198) in modo che tutte queste colonne abbiano il nome che inizia con MGW ma poi il numero è diverso e non sono sicuro del numero esatto di tali colonne che potrebbero essere 196 in un caso e 198 in altro. Quello che voglio è qualcosa del tipo: 'data.frame (ID = DF [, 1: 4], MGW = rowMeans (DF [, MGW. *]), HEL = rowMeans (DF [, HEL. *]))' significa che le prime 4 colonne non devono essere toccate mentre per il resto delle colonne prendi la media di tutte le colonne nella categoria MGW. * e HEL. * – Newbie

+0

Per questo, ti consiglio di usare dplyr e tidyr, poiché dplyr ti permette di selezionare le colonne in base a espressioni regolari. Vedi [questa domanda] (https://stackoverflow.com/questions/33401788/dplyr-using-mutate-like-rowmeans) per un esempio o [questo elenco] (https://gist.github.com/andrewheiss/ dcd38268c65396e1f18de626e70cae47) per un esempio funzionante di questa domanda. – Andrew

Problemi correlati