2012-06-08 13 views
35

Dada una trama de datos de muestra:Calcular fila significa el subconjunto de columnas

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 

¿Cuál es la mejor manera de crear una segunda trama de datos que contendría la columna de la ID y la media de cada fila? Algo como esto:

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

algo similar a:

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

Me gustaría mantener los medios alineados con sus ID 's.

Respuesta

33

Calcular fila significa en un subconjunto de columnas:

Crear un nuevo hoja.de.datos que especifica el primer columna de DF como una columna llamada ID y calcula la media de todos los demás campos en esa fila, y la pone en la columna titulada 'Means':

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

Comenzando con su trama de datos DF, se puede utilizar el paquete de 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

Gracias. También tenga en cuenta de 'clase (DF)' que no _libere_ 'data.frame', en el sentido de que cualquier función que busque un objeto' data.frame' debería aceptar 'DF' después de' setDT' (especialmente ahora que 'data.table' está en el lado maduro) – MichaelChirico

+0

¿Qué sucede si, en su lugar, quiero indicar la fila entre C2 y C3 solamente? – user3841581

+4

Luego puede usar 'DF [,. (Mean = rowMeans (.SD)), por = ID, .SDcols = c (" C2 "," C3 ")]'. El argumento '.SDcols' determina qué columnas quiere incluir en' .SD'. @ user3841581 – BenBarnes

8

Puede crear una nueva fila con $ en su trama de datos correspondiente a los medios

DF$Mean <- rowMeans(DF[,2:4]) 
Cuestiones relacionadas