计算小组百分比,有没有更好的方法

时间:2019-03-22 18:28:13

标签: r data.table aggregate

我有一个包含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) ”。我不明白。

感谢您的帮助,

大卫

3 个答案:

答案 0 :(得分:1)

可能会更快

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

答案 1 :(得分:0)

您似乎已经接近第二个代码块,但似乎您只能在by中使用每个列一次。我发现了这个作品:

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

答案 2 :(得分:0)

按照上述Frank的方法,由于实际上并不需要分子和分母,因此以下代码看起来简洁明了:

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