2016-11-08 1 views
5

J'ai un df qui a des données comme celle-ci:l'élargissement d'une trame de données pour obtenir des sommes mensuelles des revenus pour toutes les valeurs uniques des colonnes catogorical en R

sub = c("X001","X002", "X001","X003","X002","X001","X001","X003","X002","X003","X003","X002") 
month = c("201506", "201507", "201506","201507","201507","201508", "201508","201507","201508","201508", "201508", "201508") 
tech = c("mobile", "tablet", "PC","mobile","mobile","tablet", "PC","tablet","PC","PC", "mobile", "tablet") 
brand = c("apple", "samsung", "dell","apple","samsung","apple", "samsung","dell","samsung","dell", "dell", "dell") 

revenue = c(20, 15, 10,25,20,20, 17,9,14,12, 9, 11) 

df = data.frame(sub, month, brand, tech, revenue) 

Je veux utiliser sous et mois comme clé et obtenir un ligne pour chaque abonné par mois qui affiche la somme des revenus pour les valeurs uniques dans la technologie et la marque pour cet abonné pour ce mois. Cet exemple est simplifié et avec moins de colonnes car j'ai un énorme ensemble de données, j'ai décidé d'essayer de le faire avec data.table.

J'ai réussi à le faire pour une colonne catagorical, que ce soit technique ou marque en utilisant ceci:

df1 <- dcast(df, sub + month ~ tech, fun=sum, value.var = "revenue") 

mais je veux le faire pour deux ou plusieurs colonnes caqtogorical, jusqu'à présent, je l'ai essayé ceci:

df2 <- dcast(df, sub + month ~ tech+brand, fun=sum, value.var = "revenue") 

et concatène simplement les valeurs uniques des deux colonnes et sommes catogorical pour cela, mais je ne veux pas. Je voudrais séparer les colonnes pour chaque valeur unique de toutes les colonnes catogoriques.

Je suis nouveau à R et j'apprécierais vraiment toute aide.

+0

Quel serait le résultat attendu? – Haboryme

Répondre

5

(je suppose que df est un data.table plutôt data.frame comme dans votre exemple.)

Une solution possible est de première melt les données tout en gardant sub, month et revenue comme clés. De cette façon, brand et tech seront convertis en une seule variable avec une valeur correspondant à chaque combinaison existante des clés. De cette façon, nous pourrons facilement dcast en arrière que nous allons opérer contre un seul comme dans votre par colonnes premier exemple

dcast(melt(df, c(1:2, 5)), sub + month ~ value, sum, value.var = "revenue") 
#  sub month PC apple dell mobile samsung tablet 
# 1: X001 201506 10 20 10  20  0  0 
# 2: X001 201508 17 20 0  0  17  20 
# 3: X002 201507 0  0 0  20  35  15 
# 4: X002 201508 14  0 11  0  14  11 
# 5: X003 201507 0 25 9  25  0  9 
# 6: X003 201508 12  0 21  9  0  0 

Comme par commentaire OPs, vous pouvez facilement ajouter un préfixe en ajoutant aussi variable à la formule. De cette façon, la colonne sera également commandée correctement

dcast(melt(df, c(1:2, 5)), sub + month ~ variable + value, sum, value.var = "revenue") 
#  sub month brand_apple brand_dell brand_samsung tech_PC tech_mobile tech_tablet 
# 1: X001 201506   20   10    0  10   20   0 
# 2: X001 201508   20   0   17  17   0   20 
# 3: X002 201507   0   0   35  0   20   15 
# 4: X002 201508   0   11   14  14   0   11 
# 5: X003 201507   25   9    0  0   25   9 
# 6: X003 201508   0   21    0  12   9   0 
+0

Merci David, le code fonctionne bien. Cependant les colonnes générées ne sont pas commandées et je pourrais vouloir ajouter maintenant un préfixe de Tech_, Brand_ à leurs colonnes élargies respectives donc je suppose que je vais travailler dessus maintenant. –

+0

Pas de problème, il suffit d'ajouter 'variable' à la formule, voir ma modification. –