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

Posted

技术标签:

【中文标题】在 data.table 计算中使用选择中的总行数【英文标题】:Use total number of rows in selection in calculation with data.table 【发布时间】:2015-12-15 12:49:56 【问题描述】:

我一直在使用 data.tableby= 参数和组计数 (.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 进行这种计算?

【问题讨论】:

请展示一些可重现的小例子和基于此的预期输出。 @akrun 你去吧。 可能是patients[age > 12, .(n = .N), by = gender][,p:=n/sum(n)][] patients[age > 12, total:=.N][,.(n=.N, p=.N/total),by=gender] @Heroka 在我见过的语法中,我最喜欢这个。 【参考方案1】:

有点不清楚“最佳”对您意味着什么。评论选项很好,这里还有一个:

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

【讨论】:

请参阅更新后的问题以澄清“最佳”。您的解决方案符合说明。 我想也许我只是对完成它所需的语法并不感到疯狂。拥有.ALL.TOT 或类似名称会更好。

以上是关于在 data.table 计算中使用选择中的总行数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 displot 在 python 中制作 seaborn 图,在其中我们计算一个字段中的唯一值而不是总行数?

计算最终地图中的总行数减少hadoop中的输出

Oracle如何计算插入plsql块中的总行数

如何在特定模式中的所有表的选择列表中获取总行数和最大(时间戳)列

计算文件夹中所有文件的总行数[重复]

在 SQL 中计算总行数的百分比