r - 为什么中位数跳闸 data.table (整数与 double )?

标签 r integer double data.table median

我有一个名为 enc.per.day 的 data.table 用于每天的遭遇。它有 2403 行,其中指定了服务日期和当天就诊的患者数量。我想查看在任何类型的工作日看到的患者的中位数。

enc.per.day[,list(patient.encounters=median(n)),by=list(weekdays(DOS))]

那行给出了一个错误

Error in [.data.table(enc.per.day, , list(patient.encounters = median(n)), : columns of j don't evaluate to consistent types for each group: result for group 4 has column 1 type 'integer' but expecting type 'double'



以下都运行良好
tapply(enc.per.day$n,weekdays(enc.per.day$DOS),median)
enc.per.day[,list(patient.encounters=round(median(n))),by=list(weekdays(DOS))]
enc.per.day[,list(patient.encounters=median(n)+0),by=list(weekdays(DOS))]

到底是怎么回事? 我花了很长时间才弄清楚为什么我的代码不起作用。

顺便说一下,底层向量 enc.per.day$n 是一个整数
storage.mode(enc.per.day$n)

返回“整数”。此外,data.table 中的任何地方都没有 NA。

最佳答案

TL;DR 包装 medianas.double()median() '绊倒' 数据表因为 --- 即使只传递整数向量 --- median()有时返回整数值,有时返回 double 值。

## median of 1:3 is 2, of type "integer" 
typeof(median(1:3))
# [1] "integer"

## median of 1:2 is 1.5, of type "double"
typeof(median(1:2))
# [1] "double"

用一个最小的例子重现你的错误信息:
library(data.table)
dt <- data.table(patients = c(1:3, 1:2), 
                 weekdays = c("Mon", "Mon", "Mon", "Tue", "Tue"))

dt[,median(patients), by=weekdays]
# Error in `[.data.table`(dt, , median(patients), by = weekdays) : 
#   columns of j don't evaluate to consistent types for each group: 
#   result for group 2 has column 1 type 'double' but expecting type 'integer'

数据表提示是因为,在检查了要处理的第一组的值之后,得出的结论是,好的,这些结果将是“整数”类型。但是马上(或者在你的第 4 组中),它被传递了一个“double”类型的值,它不适合它的“整数”结果向量。

数据表相反,可以累积结果直到分组计算结束,然后在必要时执行类型转换,但这将需要大量额外的降低性能的开销;相反,它只是报告发生的事情并让您解决问题。在第一个组运行后,它知道结果的类型,它分配一个该类型的结果向量,只要组的数量,然后填充它。如果它稍后发现某些组返回超过 1 个项目,它将根据需要增长(即重新分配)该结果向量。但在大多数情况下,data.table对结果最终大小的第一次猜测是第一次正确(例如,每组 1 行结果),因此速度很快。

在这种情况下,使用 as.double(median(X))而不是 median(X)提供了一个合适的修复。

(顺便说一句,您使用 round() 的版本有效,因为它总是返回“double”类型的值,您可以通过键入 typeof(round(median(1:2))); typeof(round(median(1:3))) 看到。)

关于r - 为什么中位数跳闸 data.table (整数与 double )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12125364/

相关文章:

R、Windows 和外语字符

r - 从嵌套列表中按名称提取元素

ruby - 如何在 Ruby 中拼出整数?

CUDA 合并访问 FP64 数据

java - 字符串加倍,然后再返回。 ( java )

r - 具有不同因变量的 R 的方差分析

Java:如何执行向-Infinity而不是0舍入的整数除法?

在 div 中使用 Int 的 jQuery 条件语句

android - 如何管理在 GCM 服务器端的多播消息服务中添加注册 ID?

r - 如何在 R 包中使用 'src/' 中的子文件夹?