类别中的百分比

时间:2014-01-17 20:52:56

标签: r

我有一个像这样的数据框(除了有更多的行和大小,比如说):

   size amount
1   big      1
2   big      9
3 small      3
4 small      1

我希望得到一个这样的数据框,其中amountPct除以相同大小的金额之和。

   size amountPct
1   big      0.10
2   big      0.90
3 small      0.75
4 small      0.25

我可以通过重塑数据框,除以每个大小的总和,然后将其重新塑造回原始形状来实现这一点,但是有更优雅的方法吗?

4 个答案:

答案 0 :(得分:3)

您可以使用aveprop.table

> transform(dat, amountPct = ave(amount, size, FUN = prop.table))

   size amount amountPct
1   big      1      0.10
2   big      9      0.90
3 small      3      0.75
4 small      1      0.25

其中dat是数据框的名称。

答案 1 :(得分:2)

您的数据已经是 long 格式。你不必在这里融化。您只需按size列进行分组即可。以下是使用data.table的解决方案:

require(data.table)
DT <- data.table(DF)
DT[, list(amountPct = amount/sum(amount)), by=size]

#     size amountPct
# 1:   big      0.10
# 2:   big      0.90
# 3: small      0.75
# 4: small      0.25

答案 2 :(得分:1)

你可以这样做

library(plyr)
ddply(d, .(size), function(x) {
  x$amount <- x$amount / sum(x$amount, na.rm=T)
  x
})

   size amount
1   big   0.10
2   big   0.90
3 small   0.75
4 small   0.25

答案 3 :(得分:1)

作为替代方案,您可以使用“dplyr”一个新包(作者:Hadley Wickham),它提供了一组非常快速的工具来有效地操作数据集。

require(dplyr)

mutate(group_by(df,size),am_pcnt = amount/sum(amount))

   size amount am_pcnt
1   big      1    0.10
2   big      9    0.90
3 small      3    0.75
4 small      1    0.25