4

当我尝试计算百分比时,我遇到了两个数据框的问题。在第一个数据框中,我累积了一个人进行的不同操作的数量。这些是数据框,第一个是包含每个人信息的原始数据框:

z=data.frame(ID=c("0001","0002","0002","0001","0003","0003","0004","0004","0001","0003"),Amount=c(10,20,10,30,50,10,40,10,10,30),Place=c("KFC","Marcys","Ezone","Ezone","Italocafe","Italocafe","KFC","Walmart","KFC","KFC"))

当我聚合后,我有这个:

   ID       Final.Amount
1 0001           50
2 0002           30
3 0003           90
4 0004           50

我想计算与 Place 变量相关的每个 ID 的百分比,我尝试使用 plyr 但我没有得到结果。我找这样的人:

 ID     Final.Amount Perct.KFC Perct.Macys Perct.Ezonne Perct.Italocafe Percent.Walmart
1 0001           50       40%         0%          60%           0%              0% 
2 0002           30        0%         67%         33%           0%              0%
3 0003           90       33%         0%           0%           67%             0%
4 0004           50       80%         0%           0%           0%             20%

我尝试使用 plyr 但我没有得到正确的结构,我不知道我是否需要 sqldf 或其他包。

4

2 回答 2

2

data.table这是使用and base's重写的答案reshape。在计算百分比后,我必须求助于整形函数。

require(data.table)
w  <- data.table(z)
w1 <- w[, list(val=sum(Amount)), by=list(ID, Place)][, list(Place=Place, 
                       percent=val/sum(val) * 100), by=ID]
reshape(w1, idvar="ID", timevar="Place", direction="wide")

#      ID percent.KFC percent.Ezone percent.Marcys percent.Italocafe percent.Walmart
# 1: 0001    40.00000      60.00000             NA                NA              NA
# 2: 0002          NA      33.33333       66.66667                NA              NA
# 3: 0003    33.33333            NA             NA          66.66667              NA
# 4: 0004    80.00000            NA             NA                NA              20
于 2013-03-14T16:06:22.640 回答
2

使用的解决方案reshape2

library(reshape2)
d <- acast(z, ID~Place, value.var="Amount", fun=sum)
prop.table(d,1)*100

这使 :

        Ezone Italocafe      KFC   Marcys Walmart
0001 60.00000   0.00000 40.00000  0.00000       0
0002 33.33333   0.00000  0.00000 66.66667       0
0003  0.00000  66.66667 33.33333  0.00000       0
0004  0.00000   0.00000 80.00000  0.00000      20
于 2013-03-14T16:11:09.373 回答