2017-07-17 1 views
1

J'ai un ensemble de données avec 5 colonnes:Pivot en utilisant plusieurs colonnes

store_id year event item units 
123   2015  sale_2 abc  2 
234   2015  sale_3 def  1 
345   2015  sale_2 xyz  5 

Je suis en train de tourner la items par store_id, year, and event pour obtenir le sum. Par exemple

store_id year event abc  def xyz 
123   2015 sale_2 7  0  0 
234   2015 sale_2 2  1  0 

Je n'arrive pas à trouver la meilleure méthode. Normalement j'utiliserais dummyVars dans le caret pour faire ceci mais j'ai besoin de sommes au lieu de drapeau. J'ai regardé tapply, mais il ne peut pas gérer plus de 2 variables de regroupement.

D'autres suggestions?

+0

il semble que vous vouliez dire pour le magasin 345 être magasin 123 à la place de telle sorte que 5 + 2 = 7 – C8H10N4O2

Répondre

3
library(reshape2) 
dcast(df, store_id + year + event ~ item, fun.aggregate = sum, value.var='units') 
# store_id year event abc def xyz 
# 1:  123 2015 sale_2 2 0 0 
# 2:  234 2015 sale_3 0 1 0 
# 3:  345 2015 sale_2 0 0 5 

Pour les grands ensembles de données considèrent

# uses dcast.data.table, much faster 
library(data.table) 
setDT(df) 
dcast(df, store_id + year + event ~ item, fun.aggregate = sum, value.var='units') 
2
library(dplyr) 
library(tidyr) 
data %>% 
group_by(store_id, year, event, item) %>% 
summarize(N = sum(units)) %>% 
spread(item, N) 

Vous pouvez utiliser dplyr pour regrouper et récapituler et répartir les données dans les colonnes d'élément souhaitées.