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
。
我是编程新手,希望得到任何帮助。 我有一个包含产品名称和销售日期的数据框。对于每种产品,我需要查看在星期一、星期二、星期三等时间售出的分数。
请按照以下步骤复制我的数据框:
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
。