data.frame Groupe Par colonne

J’ai un bloc de données DF.

Dis DF est:

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

Maintenant, je veux combiner les lignes par la colonne A et avoir la sum de la colonne B.

Par exemple:

  AB 1 1 5 2 2 3 3 3 11 

Je le fais actuellement en utilisant une requête SQL avec la fonction sqldf. Mais pour une raison quelconque, c’est très lent. Y a-t-il un moyen plus pratique de le faire? Je pourrais le faire manuellement aussi en utilisant une boucle for mais elle est à nouveau lente. Ma requête SQL est “Select A, Count (B) from DF group by A”.

En général, chaque fois que je n’utilise pas d’opérations vectorisées et que j’utilise pour des boucles, les performances sont extrêmement lentes, même pour des procédures simples.

C’est une question courante. En base, l’option que vous recherchez est aggregate . En supposant que votre data.frame s’appelle “mydf”, vous pouvez utiliser ce qui suit.

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

Je recommande également de regarder dans le package “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 

En utilisant 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 

Avec sqldf :

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

Je recommande de jeter un coup d’œil au paquet plyr . Ce n’est peut-être pas aussi rapide que data.table ou d’autres paquetages, mais c’est assez instructif, surtout lorsque vous commencez avec R et que vous devez manipuler des données.

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

Je ne suis pas certain des avantages exacts par rapport aux agrégats.