web-dev-qa-db-fra.com

data.frame Grouper par colonne

J'ai une trame de données DF.

Dites DF est:

  A B
1 1 2
2 1 3
3 2 3
4 3 5
5 3 6 

Maintenant, je veux combiner ensemble les lignes de la colonne A et avoir la somme de la colonne B.

Par exemple:

  A B
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 aussi manuellement en utilisant une boucle for mais c'est encore lent. Ma requête SQL est "Sélectionnez A, Comptez (B) de DF groupe par A".

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

60
nikosdi

C'est une question commune. Dans la 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)
  A  B
1 1  5
2 2  3
3 3 11

Je recommanderais également de regarder dans le paquet "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
94

Utiliser 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]
## 
##   A  B
## 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')
21
mpalanco

Je recommanderais de jeter un coup d'œil au paquetage plyr. Cela pourrait ne pas être aussi rapide que data.table ou d’autres progiciels, mais c’est assez instructif, en particulier lorsque vous démarrez avec R et que vous devez manipuler certaines 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
  A  B
1 1  5
2 2  3
3 3 11
9
r0bert
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.

4
Soc