2012-06-08 13 views
35

Dato un frame di dati di esempio:Calcolare la fila significa da sottoinsieme di colonne

C1<-c(3,2,4,4,5) 
C2<-c(3,7,3,4,5) 
C3<-c(5,4,3,6,3) 
DF<-data.frame(ID=c("A","B","C","D","E"),C1=C1,C2=C2,C3=C3) 

DF 
    ID C1 C2 C3 
    1 A 3 3 5 
    2 B 2 7 4 
    3 C 4 3 3 
    4 D 4 4 6 
    5 E 5 5 3 

Qual è il modo migliore per creare un secondo frame di dati che contengono la colonna ID e la media di ogni riga? Qualcosa di simile a questo:

ID Mean 
A 3.66 
B 4.33 
C 3.33 
D 4.66 
E 4.33 

Qualcosa di simile a:

RM<-rowMeans(DF[,2:4]) 

Mi piacerebbe mantenere i mezzi in linea con le loro ID 's.

risposta

33

Calcolare fila significa su un sottoinsieme di colonne:

Creare un nuovo data.frame che specifica il primo colonna da DF come una colonna chiamata ID e calcola la media di tutti gli altri campi su quella riga e la inserisce nella colonna "Mezzi":

data.frame(ID=DF[,1], Means=rowMeans(DF[,-1])) 
    ID Means 
1 A 3.666667 
2 B 4.333333 
3 C 3.333333 
4 D 4.666667 
5 E 4.333333 
21

partire con la cornice di dati DF, è possibile utilizzare il pacchetto data.table:

library(data.table) 

## EDIT: As suggested by @MichaelChirico, setDT converts a 
## data.frame to a data.table by reference and is preferred 
## if you don't mind losing the data.frame 
setDT(DF) 

# EDIT: To get the column name 'Mean': 

DF[, .(Mean = rowMeans(.SD)), by = ID] 

#  ID  Mean 
# [1,] A 3.666667 
# [2,] B 4.333333 
# [3,] C 3.333333 
# [4,] D 4.666667 
# [5,] E 4.333333 
+1

Grazie. Si noti inoltre da 'class (DF)' che non _lose_ il 'data.frame', nel senso che qualsiasi funzione che cerca un oggetto' data.frame' deve accettare 'DF' dopo' setDT' (specialmente ora che 'data.table' è sul lato maturo) – MichaelChirico

+0

E se invece volessi la media delle righe solo tra C2 e C3? – user3841581

+4

Quindi è possibile utilizzare 'DF [,. (Mean = rowMeans (.SD)), da = ID, .SDcols = c (" C2 "," C3 ")]'. L'argomento '.SDcols' determina quali colonne vuoi includere in' .SD'. @ user3841581 – BenBarnes

8

È possibile creare una nuova riga con $ nella cornice di dati corrispondente al mezzo

DF$Mean <- rowMeans(DF[,2:4]) 
Problemi correlati