【问题标题】:R: reshaping a dataframe and creating proportionsR:重塑数据框并创建比例
【发布时间】:2015-03-19 22:40:38
【问题描述】:

我是编程新手,如果有任何帮助,我将不胜感激。 我有一个包含产品名称和销售日期的数据框。对于每种产品,我需要查看周一、周二、周三等销售的部分。

请按照此复制我的数据框:

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 的比例?

谢谢!

【问题讨论】:

    标签: r reshape


    【解决方案1】:

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

    另外,使用as.data.frame.matrix 代替data.frame 来避免重塑要求:

    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
    

    您可能还需要考虑将daylevels 以适当的周日至周六顺序制作为factor

    【讨论】:

    • 感谢您的解决方案。我实际上想获得每种产品每天销售的比例。例如,如果 A 占销售额的 0.25,我还需要每天销售 A 的比例,使 A=1。例如,如果周一、周二、周三、周四和周五卖出了 0.2 件 A,周六和周日卖出了 0 件,那么我的 A 总数将为 1。如果上面的内容不是很清楚,我很抱歉
    • @RUser - 产品内百分比和一天内百分比选项都在上面!
    【解决方案2】:

    试试这个:

    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
    

    【讨论】:

    • 你可以把它作为答案发布,这是解决问题的另一种观点!
    • 感谢您的解决方案。我实际上想获得每种产品每天销售的比例。例如,如果 A 占销售额的 0.25,我还需要每天销售 A 的比例,使 A=1。例如,如果周一、周二、周三、周四和周五卖出了 0.2 件 A,周六和周日卖出了 0 件,那么我的 A 总数将为 1。如果上面没有很清楚,我很抱歉。
    猜你喜欢
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多