首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:重塑数据并创造比例

R:重塑数据并创造比例
EN

Stack Overflow用户
提问于 2015-03-19 22:40:38
回答 2查看 192关注 0票数 2

我对编程很陌生,希望能对此有所帮助。我有一个数据框架,其中包含产品名称和销售日期。对于每一种产品,我都需要看到周一、周二、周三等地出售的分数。

请跟着这个复制我的数据:

代码语言:javascript
复制
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))

我尝试了以下几点:

代码语言:javascript
复制
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")

这给了我

代码语言:javascript
复制
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在一周的一天?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-19 23:15:01

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

另外,不要使用data.frame,而是使用as.data.frame.matrix来避免重塑需求:

代码语言:javascript
复制
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

您还可以考虑在适当的周日-周六订单中,将dayfactorlevels一起使用。

票数 2
EN

Stack Overflow用户

发布于 2015-03-19 23:04:55

试试这个:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29156320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档