【问题标题】:Conditional expressions within data.table 'by'data.table 'by' 中的条件表达式
【发布时间】: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 万行),但不能保证(根据示例)每个年龄都有两个性别的值。

我想到的一种方法是:

  1. 创建一个按“分组”和“年龄”汇总的数据表,并计算“价值”的总和。这将分别为“M”和“F”行计算
  2. 联接'Grouping'和Age这两个表,并计算联接中Female表中'Value'超过'Male'的行数
  3. 将 (2) 的输出除以按“分组”分组的唯一年龄数

这似乎有点繁琐,我想知道是否有一种更简单、更有效的方法可以使用 data.table 和 'by' 来执行此操作而无需进行连接?

谢谢, 菲尔

【问题讨论】:

    标签: r join data.table


    【解决方案1】:

    试试这个。这个想法在评论中。

    # group by Grouping,Age
    # calculate sum(Value) and sum(Value) for Gender == "F"
    dt1 <- DT[,
              .(sum(Value),
                .SD[Gender == "F",sum(Value)]
                 ),
              keyby = .(Grouping,Age)]
    # add column: number of gender F has a higher value
    dt1[,NF:=fifelse(V2/V1>0.5,1,0),by = .(Grouping,Age)]
    dt1[,.(sum(NF)/.N),by = Grouping]
    

    【讨论】:

      【解决方案2】:

      也许可以试试:

      DT[, .(Value=sum(Value)), keyby=.(Grouping, Age, Gender)][, 
          .(Gender=Gender[which.max(Value)]), .(Grouping, Age)][, 
              .(Proportion=sum(Gender=="F")/.N), Grouping]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-29
        • 2016-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多