我一直在使用data.table
by=
个参数和组计数(.N
)来创建频率表。
例如:
patients = data.table(
id = 1:10,
gender = c("M", "F"),
age = c(19, 7, 3, 13, 18, 12, 16, 15, 9, 4)
)
patients[, .(n = .N), by = gender]
产地:
gender n
1: M 5
2: F 5
这很有效,虽然我经常也需要计算比例,我这样做如下:
patients[, .(n = .N, p = .N / nrow(patients)), by = gender]
,并提供:
gender n p
1: M 5 0.5
2: F 5 0.5
这虽然有点笨重,但在我没有patients
处理之前工作正常,例如在进行子集化时,会产生这种结构:
patients[age > 12, .(n = .N, p = .N / nrow(patients[age > 12])), by = gender]
使用我们的样本数据,它给出了:
gender n p
1: M 3 0.6
2: F 2 0.4
我已经注意到的一个解决方案是预先计算子集:
teens = patients[age > 12]
teens[, .(n = .N, p = .N / nrow(teens)), by = gender]
产生与上述相同的输出。
然而,这也是次优的,因为它需要明确引用teens
。在没有明确引用子集的情况下使用data.table
进行这种计算的最佳方式是什么?
答案 0 :(得分:3)
有点不清楚“最佳”对您意味着什么。评论选项很好,还有一个:
patients[age > 12, {nrow = .N; .SD[, .(n = .N, p = .N/nrow), by = gender]}]
# gender n p
#1: M 3 0.6
#2: F 2 0.4