R:重塑数据框并创建比例

R: reshaping a dataframe and creating proportions

我是编程新手,希望得到任何帮助。 我有一个包含产品名称和销售日期的数据框。对于每种产品,我需要查看在星期一、星期二、星期三等时间售出的分数。

请按照以下步骤复制我的数据框:

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 列求和并得到 A、B、C 的总售出比例,但如何获得按星期几计算的 A、B、C 的售出比例?

谢谢!

试试这个:

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

prop.table(...,margin=) 结合使用时,这是一个非常简单的 table 操作。 margin= 参数允许计算行、列或整个 table(默认)prop.table(...,1) 行的比例; 2 做专栏,3 做分层等等。

另外,不要使用 data.frame,而是使用 as.data.frame.matrix 来避免整形要求:

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

您可能还想考虑将 day 设为 factor 并按照适当的周日至周六顺序使用 levels