【发布时间】: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