2016-11-08 1 views
5

У меня есть ФР, который имеет данные, как это:Widening в dataframe, чтобы получить ежемесячные суммы дохода для всех уникальных значений catogorical столбцов в 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) 

Я хочу использовать суб и месяц, как ключ и получить один для каждого абонента в месяц, который отображает сумму доходов за уникальные значения в технологии и бренде для этого абонента за этот месяц. Этот пример упрощен и с меньшим количеством столбцов, поскольку у меня есть огромный набор данных, который я решил попробовать сделать с data.table.

мне удалось сделать это за одну catagorical колонки, либо технология или бренд с помощью этого:

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

, но я хочу сделать это в течение двух или более caqtogorical колонн, до сих пор я попытался это:

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

и просто присоединяет уникальные значения обоих catogorical столбцов и сумм для этого, но я не хочу этого. Я разделяю отдельные столбцы для каждого уникального значения всех столбцов.

Я новичок в R и буду очень признателен за любую помощь.

+0

Каким будет ожидаемый выход? – Haboryme

ответ

5

(я буду считать, что df является data.table скорее data.frame, как в вашем примере.)

Одно из возможных решений для этого является первым melt данных, сохраняя при этом sub, month и revenue как ключи. Таким образом, brand и tech будут преобразованы в одну переменную со значением, соответствующим каждой существующей комбинации ключей. Таким образом, мы сможем легко dcast его обратно, как мы будем работать против одного столбцов, как в первом примере

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 

По OPs комментария, вы можете легко добавить префикс, добавив также variable к формуле. Таким образом, колонна будет также упорядочена правильно

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

Спасибо, Дэвид, код работает нормально. Однако созданные столбцы не упорядочены, и теперь я могу добавить префикс Tech_, Brand_ в соответствующие расширенные столбцы, поэтому я думаю, что теперь буду работать над этим. –

+0

Нет проблем, просто добавьте 'variable' в формулу, см. Мое редактирование. –