【发布时间】:2021-06-12 07:12:27
【问题描述】:
我有一个数据表如下
DT <- data.table(Age = c(16,16,17,19,20,21,23,25,27,35,25,35,35),
Grouping = c(1,1,1,2,2,2,2,3,3,3,3,3,3),
Gender = c("M","F","M","M","F","F","M","F","F","M","M","M","F"),
Value = c(1000,2000,1500,1250,2000,3000,1000,2500,4000,1000,3500,5000,10000))
我想创建一个输出数据表,用于计算特定年龄的比例,其中女性相对于男性的“价值”总和较高,所有年龄均按“分组”分组。
这可能有点令人困惑,所以我将在下面解释目标输出:
Target_output <- data.table(Grouping = c(1,2,3),
Proportion = c(0.5,0.5,2/3))
查看“分组”值 1,我们有 2 个不同的年龄(16 岁和 17 岁)。 对于 16 岁,“M”的“Value”总和为 1000,“F”为 2000,这意味着该年龄的“F”更高。另一个唯一的年龄是 17 岁,其中只有“M”的值。这意味着“F”对于 2 个唯一年龄中的 1 个具有更高的值总和,给出 0.5 的比例作为分组值“1”的输出。
对于第 2 组,我们有四行,在本例中,所有这些行都是针对唯一年龄的。从数值上看,“F”在 4 个年龄中有 2 个具有较高的值,这意味着第二组的输出为 0.5。
对于第 3 组,我们有 6 个值,其中 3 个用于唯一年龄 - 25、27 和 35。 对于 25 岁,“F”的总值为 2500,低于“M”的 3500 总值。 对于 27,只有“F”的值。 对于 35 岁,“M”的总数为 6000(1000 + 5000),“F”的总数为 10000。 因此,输出为 2/3,因为该分组的三个唯一年龄中有两个的“F”总和较高。
在实际数据集中,每个年龄、性别和分组有多个值(超过 100 万行),但不能保证(根据示例)每个年龄都有两个性别的值。
我想到的一种方法是:
- 创建一个按“分组”和“年龄”汇总的数据表,并计算“价值”的总和。这将分别为“M”和“F”行计算
- 联接'Grouping'和Age这两个表,并计算联接中Female表中'Value'超过'Male'的行数
- 将 (2) 的输出除以按“分组”分组的唯一年龄数
这似乎有点繁琐,我想知道是否有一种更简单、更有效的方法可以使用 data.table 和 'by' 来执行此操作而无需进行连接?
谢谢, 菲尔
【问题讨论】:
标签: r join data.table