我有一个包含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) ”。我不明白。
感谢您的帮助,
大卫
答案 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)]