4

パーセンテージを計算しようとすると、2つのデータフレームに問題があります。最初のデータフレームには、人が行うさまざまな操作の累積金額があります。これらはデータフレームであり、最初は各人の情報を含む元のデータフレームです。

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と baseを使用して回答を書き直したものを次に示します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 に答える