data.frame Group By coluna

Eu tenho um quadro de dados DF.

Diga DF é:

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

Agora quero combinar as linhas pela coluna A e ter a sum da coluna B.

Por exemplo:

  AB 1 1 5 2 2 3 3 3 11 

Eu estou fazendo isso atualmente usando uma consulta SQL com a function sqldf. Mas por algum motivo é muito lento. Existe alguma maneira mais conveniente de fazer isso? Eu poderia fazê-lo manualmente também usando um loop for, mas é novamente lento. Minha consulta SQL é “Selecione A, Contagem (B) do grupo DF por A”.

Em geral, sempre que não uso operações vetorizadas e uso loops, o desempenho é extremamente lento, mesmo para procedimentos únicos.

Essa é uma pergunta comum. Na base, a opção que você está procurando é aggregate . Supondo que seu data.frame é chamado “mydf”, você pode usar o seguinte.

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

Eu também recomendaria olhar para o pacote “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 

Com sqldf :

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

Eu recomendaria dar uma olhada no pacote plyr . Pode não ser tão rápido quanto o data.table ou outros pacotes, mas é bastante instrutivo, especialmente ao iniciar com R e ter que fazer alguma manipulação de dados.

 > 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) 

Não tenho certeza das vantagens exatas sobre o agregado.