Grupo data.frame Por columna

Tengo un dataframe DF.

Diga DF es:

AB 1 1 2 2 1 3 3 2 3 4 3 5 5 3 6 

Ahora quiero combinar las filas por la columna A y tener la sum de la columna B.

Por ejemplo:

  AB 1 1 5 2 2 3 3 3 11 

Estoy haciendo esto actualmente usando una consulta SQL con la función sqldf. Pero por alguna razón, es muy lento. ¿Hay alguna forma más conveniente de hacer eso? Podría hacerlo manualmente también usando un ciclo for, pero nuevamente es lento. Mi consulta SQL es “Seleccione A, conteo (B) del grupo DF por A”.

En general, cuando no utilizo operaciones vectorizadas y uso bucles for, el rendimiento es extremadamente lento incluso para procedimientos únicos.

Esta es una pregunta común. En la base, la opción que está buscando es aggregate . Suponiendo que su data.frame se llama “mydf”, puede usar lo siguiente.

 > aggregate(B ~ A, mydf, sum) AB 1 1 5 2 2 3 3 3 11 

También recomendaría buscar en el paquete “data.table”.

 > library(data.table) > DT <- data.table(mydf) > DT[, sum(B), by = A] A V1 1: 1 5 2: 2 3 3: 3 11 

Usando dplyr :

 require(dplyr) df <- data.frame(A = c(1, 1, 2, 3, 3), B = c(2, 3, 3, 5, 6)) df %>% group_by(A) %>% summarise(B = sum(B)) ## Source: local data frame [3 x 2] ## ## AB ## 1 1 5 ## 2 2 3 ## 3 3 11 

Con sqldf :

 library(sqldf) sqldf('SELECT A, SUM(B) AS B FROM df GROUP BY A') 

Yo recomendaría echarle un vistazo al paquete plyr . Puede que no sea tan rápido como data.table u otros paquetes, pero es bastante instructivo, especialmente al comenzar con R y tener que manipular algunos datos.

 > DF <- data.frame(A = c("1", "1", "2", "3", "3"), B = c(2, 3, 3, 5, 6)) > library(plyr) > DF.sum <- ddply(DF, c("A"), summarize, B = sum(B)) > DF.sum AB 1 1 5 2 2 3 3 3 11 
 require(reshape2) T <- melt(df, id = c("A")) T <- dcast(T, A ~ variable, sum) 

No estoy seguro de las ventajas exactas sobre el agregado.