【问题标题】:Calculating group percentages, is there a better way计算组百分比,有没有更好的方法
【发布时间】:2019-08-13 19:20:29
【问题描述】:

我有一个包含 3 个分类变量的数据表:primarydx、NumDx 和 ContractType。

primarydx <- rep(c("AB","MT"),10)
NumDx <- rep(c(1,2,3), length.out=20 )
ContractType <- rep( c("W","L","W","W","W") , length.out=20)
SecDx3 <- data.table(primarydx, NumDx, ContractType)

我想计算 primarydx 和 NumDx 中每个 ContractType 的记录百分比。以下代码有效:

Num <-SecDx3[ , .(n=.N), by=.(primarydx, NumDx, ContractType)]
denom <- SecDx3[ , .(d=.N), by=.(primarydx, NumDx)]
pct <- merge(Num,denom)
pct[,pct:=n/d][]

有没有更好的方法?

我确实找到了类似的东西:

SecDx3[,{
  d =.N
  .SD[, .(pct = .N/d), by=.(primarydx, NumDx, ContractType)]
  }, by=.(primarydx, NumDx)]

但这会返回错误“'by' 或 'keyby' 列表中的项目的长度为 (1,1,20)。每个项目的长度必须与 x 中的行或 i (20) 返回的行数相同。”我不明白。

感谢您的帮助,

大卫

【问题讨论】:

  • 你是什么意思percentage of records
  • 也分享一些示例数据
  • 我认为你有一个错字,在多个对象上使用 as.data.table 而不是 data.table(...)
  • 无论如何,您的方法非常标准。还有DT[, .N, by=.(ContractType, primarydx, NumDx)][, .(ContractType, N, d = sum(N), pct = N/sum(N)), by=.(primarydx, NumDx)]
  • 您的意思是“比例”而不是“百分比”,因为您的结果总和为 1.00 而不是 100%

标签: r data.table aggregate


【解决方案1】:

按照上面弗兰克的方法,由于分子和分母并不是真正需要的,所以下面的代码看起来紧凑而清晰:

SecDx3[, .N, by=.(ContractType, primarydx, NumDx)
       ][, .(pct = N/sum(N)), by=.(primarydx, NumDx)]

【讨论】:

    【解决方案2】:

    可能会更快

    SecDx3[, d:=.N, by=.(primarydx, NumDx)
           ][, {
               n<-.N
               .(n=n, d=d[1L], pct=n/d[1L])
             },
             by=.(primarydx, NumDx, ContractType)]
    

    【讨论】:

      【解决方案3】:

      看起来您已经接近您的第二个代码块,但您似乎只能在 bys 中使用每一列一次。我发现这是可行的:

      SecDx3[, {n <- .N; .SD[, list(pct = .N / n), by = .(ContractType)]}, by = .(primarydx, NumDx)]
      
          primarydx NumDx ContractType       pct
       1:        AB     1            W 0.7500000
       2:        AB     1            L 0.2500000
       3:        MT     2            L 0.2500000
       4:        MT     2            W 0.7500000
       5:        AB     3            W 1.0000000
       6:        MT     1            W 1.0000000
       7:        AB     2            W 0.6666667
       8:        AB     2            L 0.3333333
       9:        MT     3            W 0.6666667
      10:        MT     3            L 0.3333333
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-21
        • 2023-03-29
        • 2013-02-12
        • 2017-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多