使用data.table计算计算中选择的总行数

时间:2015-12-15 12:49:57

标签: r data.table

我一直在使用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进行这种计算的最佳方式是什么?

1 个答案:

答案 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