2016-11-08 19 views
5

mam df, która ma dane jak poniżej:poszerzenia dataframe uzyskać miesięczne sumy dochodów wszystkich unikalnych wartościach catogorical kolumn w 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) 

chcę użyć sub i miesiąc jako klucz i dostać jeden wiersz dla każdego abonenta miesięcznie, który wyświetla sumę przychodów dla unikalnych wartości w technologii i marce dla tego abonenta za ten miesiąc. Ten przykład jest uproszczony iz mniejszą ilością kolumn, ponieważ mam ogromny zestaw danych, postanowiłem spróbować zrobić to z data.table.

udało mi się zrobić to za jednym catagorical kolumnie, albo tech lub marki za pomocą tego:

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

ale chcę to zrobić dla dwóch lub więcej caqtogorical kolumn, tak daleko Próbowałem to:

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

i to właśnie Łączy unikalne wartości obu catogorical kolumn i sum na to, ale nie chcę tego. I wan oddzielne kolumny dla każdej niepowtarzalnej wartości wszystkich kolumn katogorycznych.

Jestem nowy dla R i byłbym wdzięczny za każdą pomoc.

+0

Jaki byłby oczekiwany wynik? – Haboryme

Odpowiedz

5

(będę zakładać, że df jest data.table raczej data.frame jak w przykładzie).

Jednym z możliwych rozwiązań jest to, aby pierwsze melt danych przy zachowaniu sub, month i revenue jako kluczy. W ten sposób zostanie przekształcona w jedną zmienną o wartości odpowiadającej każdej istniejącej kombinacji kluczy. W ten sposób będziemy w stanie łatwo dcast go z powrotem jak będziemy działać przeciwko pojedynczym Column- jak w pierwszym przykładzie

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 

Zgodnie PO skomentować, można łatwo dodać przedrostek dodając także variable do formuły. W ten sposób kolumna zostanie również prawidłowo zamówiona:

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

Dziękuję David, kod działa dobrze. Jednak wygenerowane kolumny nie są uporządkowane i może chciałbym teraz dodać prefiks Tech_, Brand_ do odpowiednich rozszerzonych kolumn, więc myślę, że będę nad tym pracował. –

+0

Nie ma problemu, po prostu dodaj "zmienną" do formuły, zobacz moją edycję. –