在 data.table 计算中使用选择中的总行数
Posted
技术标签:
【中文标题】在 data.table 计算中使用选择中的总行数【英文标题】:Use total number of rows in selection in calculation with data.table 【发布时间】:2015-12-15 12:49:56 【问题描述】:我一直在使用 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
进行这种计算?
【问题讨论】:
请展示一些可重现的小例子和基于此的预期输出。 @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 图,在其中我们计算一个字段中的唯一值而不是总行数?