使用data.table按组计算数值的百分比/比例。

9

我有一个看起来像下面这样的data.table:

x, y, sum(count)
1, 1, 3
1, 2, 7
1, 3, 8
2, 1, 4
2, 2, 3
2, 3, 10

等等。它是由xy键控的,我在一个count列上进行了sum。我想按照x的值将其分解为百分比,使其变成:

x, y, percentage(counts)
1, 1, 16.7
1, 2, 38.9
1, 3, 44.4
2, 1, 23.5
2, 2, 17.6
2, 3, 58.8

为了使每个x值的总百分比达到100%,我使用data.table包来实现此目标。非常感谢您的帮助。


2
我不确定你的请求是否与你显示的数据相匹配,“以便每个x值的总百分比总计为100%”:这样做不会使第一行的结果约为16.666%而不是37.5%吗? - crogg01
我相信你正在尝试分两步聚合数据。第一步,计算每个组的sum()。第二步,计算百分比。实际上,你可以将聚合和计算百分比合并为一步操作。可以参考这个问题 - marbel
@HansRoggeman 我可以做数学...谢谢!^-^ - kay
2个回答

10

我不太理解已经发布的data.table解决方案,所以我会像这样做(我会更改列名称的名称,以避免大量使用反引号引用列名称):

dt[ , `percentage(counts)` := `sum(count)` / sum( `sum(count)` ) * 100 , by = "x" ]
#   x y sum(count) percentage(counts)
#1: 1 1          3           16.66667
#2: 1 2          7           38.88889
#3: 1 3          8           44.44444
#4: 2 1          4           23.52941
#5: 2 2          3           17.64706
#6: 2 3         10           58.82353

4
参见 prop.table() - hadley
4
正如haldey所说,您可以使用prop.table()函数,例如dt[ , per := prop.table(\sum(count)`) , by = "x"]`。 - Simon O'Hanlon

2

在您的原始数据(未汇总)上,您可以执行以下操作:

allsums <- sum(data[, counts])
data[, percentage = 100*sum(counts)/allsums, by="x,y"]

或者在您的汇总数据中:
allsums <- sum(data[, sums])
data[, percentage = 100*sums/allsums, by="x,y"]

我希望我没有误解你的意思,但是根据你的第二个输出,我得到了以下结果:
x y 百分比
1: 1 1 8.571429
2: 1 2 20.000000
3: 1 3 22.857143
4: 2 1 11.428571
5: 2 2 8.571429
6: 2 3 28.571429
至于你的第一个建议,我没有只有计数。
- kay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接