2015-03-19 3 views
2

Я новичок в программировании и буду признателен за любую помощь в этом. У меня есть кадр данных, который содержит названия продуктов и день их продажи. Для каждого продукта, я должен был бы увидеть фракцию, которые продаются в понедельник, вторник, среду и т.д.R: изменение формы данных и создание пропорций

Пожалуйста, следить за этим, чтобы повторить мой dataframe:

Product=c("A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","C","C","C") 
Day=c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Monday","Tuesday","Wednesday","Saturday","Sunday" ,"Monday") 
df=data.frame(cbind(Product,Day)) 

Я попытался следующие:

data.frame(prop.table(with(df,table(Product,Day)))) 

df.wide=reshape(data.frame(prop.table(with(df,table(Product,Day)))), 
        timevar="Day", 
        idvar="Product", 
        direction="wide") 

, который дает мне

Product Freq.Friday Freq.Monday Freq.Saturday Freq.Sunday Freq.Thursday Freq.Tuesday Freq.Wednesday 
     A 0.1111111 0.11111111 0.11111111 0.00000000  0.1111111 0.11111111  0.11111111 
     B 0.0000000 0.05555556 0.00000000 0.00000000  0.0000000 0.05555556  0.05555556 
     C 0.0000000 0.05555556 0.05555556 0.05555556  0.0000000 0.00000000  0.00000000 

Я могу суммировать столбцы 2-8 и получить общую часть а, в , C продается, но как я могу получить долю A, B, C, проданную в День недели?

Спасибо!

ответ

2

Это довольно простой table операция в сочетании с prop.table(...,margin=). аргумент margin= позволяет вычислять пропорции для строк, столбцов или всей таблицы (по умолчанию) prop.table(...,1) делает строки; 2 делает столбцы, 3 делает слои и т.д ..

Кроме того, вместо data.frame, используйте as.data.frame.matrix, чтобы избежать требования RESHAPE:

as.data.frame.matrix(prop.table(with(df,table(Product,Day)),1)) 
#  Friday Monday Saturday Sunday Thursday Tuesday Wednesday 
#A 0.1666667 0.1666667 0.1666667 0.0000000 0.1666667 0.1666667 0.1666667 
#B 0.0000000 0.3333333 0.0000000 0.0000000 0.0000000 0.3333333 0.3333333 
#C 0.0000000 0.3333333 0.3333333 0.3333333 0.0000000 0.0000000 0.0000000 

as.data.frame.matrix(prop.table(with(df,table(Product,Day)),2)) 
# Friday Monday Saturday Sunday Thursday Tuesday Wednesday 
#A  1 0.50 0.6666667  0  1 0.6666667 0.6666667 
#B  0 0.25 0.0000000  0  0 0.3333333 0.3333333 
#C  0 0.25 0.3333333  1  0 0.0000000 0.0000000 

Вы могли бы также рассмотреть вопрос о внесении dayfactor с levels в соответствующий воскресный-субботний заказ.

+0

Благодарим за решение. Я действительно хочу получить долю, продаваемую в каждый день за продукт. Например, если A учитывает 0,25 продаж, мне также нужно, какая доля A продается в каждый день, делая сумму A = 1. Например, если 0,2 А были проданы в понедельник, вторник, среду, четверг и пятницу и 0 в субботу и воскресенье, моя общая сумма для А будет 1. Я сожалею, если это было не очень ясно выше –

+0

@RUser - оба % внутри продукта и% в течение дня уже выше! – thelatemail

+0

спасибо, факторизованные дни, чтобы заказать его правильно! –

1

Попробуйте это:

library(reshape2) 
library(plyr) 

ddply(dcast(df, Product ~ Day),1,function(u) data.frame(u[1], u[-1]/sum(u[-1]))) 

# Product Friday Monday Saturday Sunday Thursday Tuesday Wednesday 
#1  A 0.1666667 0.1666667 0.1666667 0.0000000 0.1666667 0.1666667 0.1666667 
#2  B 0.0000000 0.3333333 0.0000000 0.0000000 0.0000000 0.3333333 0.3333333 
#3  C 0.0000000 0.3333333 0.3333333 0.3333333 0.0000000 0.0000000 0.0000000 
+0

Вы можете разместить его в качестве ответа, это еще одна точка зрения, решая проблему! –

+0

Благодарим за решение. Я действительно хочу получить долю, продаваемую в каждый день за продукт. Например, если A учитывает 0,25 продаж, мне также нужно, какая доля A продается в каждый день, делая сумму A = 1. Например, если 0,2 из А были проданы в понедельник, вторник, среду, четверг и пятницу и 0 в субботу и воскресенье, моя общая сумма для А будет 1. Я сожалею, если это было не очень ясно выше. –

Смежные вопросы