我有一个像这样的数据框(除了有更多的行和大小,比如说):
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
我可以通过重塑数据框,除以每个大小的总和,然后将其重新塑造回原始形状来实现这一点,但是有更优雅的方法吗?
答案 0 :(得分:3)
您可以使用ave
和prop.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