【问题标题】:Calculate percentages / proportions of values by group using data.table使用 data.table 按组计算值的百分比/比例
【发布时间】:2014-01-03 18:48:00
【问题描述】:

我有一个data.table,如下所示:

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

等等。它由x 和y 键入,我在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 包执行此操作。提前感谢您的帮助。

【问题讨论】:

  • 我不确定您的请求是否与您显示的数据相匹配“因此每个 x 值的总百分比总计为 100%”:第一行不会给出大约 16.666% 而不是 37.5% 吗?
  • 我相信您正在尝试分两步进行聚合。 1) 计算每个组的 sum()。 2) 计算百分比。您可以一步聚合和计算百分比。 Check out this question.
  • @HansRoggeman 我可以做数学......谢谢! ^-^

标签: r data.table


【解决方案1】:

我不太了解已经发布的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

【讨论】:

  • 另见prop.table()
  • 正如 haldey 所说,您可以使用 prop.table() 函数,例如dt[ , per := prop.table(`sum(count)`) , by = "x"].
【解决方案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 percent > 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 至于你的第一个建议,我不只是计数。
猜你喜欢
  • 2020-12-03
  • 1970-01-01
  • 2020-02-18
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 2019-03-06
相关资源
最近更新 更多