为什么达data.table(整数与双)平均行程?(Why does median trip up

2019-06-27 08:45发布

我有一个名为enc.per.day每天遇到data.table。 它具有在指定服务的日期2403行的看到那一天的患者人数。 我想看到的看到在任何类型平日的患者中位数。

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

该行给出了一个错误

误差在[.data.table (enc.per.day,列表(patient.encounters =中间值(N)),:j的列不计算一致类型的每个组:导致对其组4具有第1分型“整数”,但期待类型“双”

下面所有做工精良

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任何地方。

Answer 1:

TL; DR包medianas.double()

median() “时刻表向上” data.table因为---即使当仅通过整数矢量--- median()有时返回一个整数值,并且有时会返回一个双。

## 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'

data.table抱怨因为,检查该第一组的值被处理后,它的结论是,OK,这些结果将是类型“整数”的。 但随后马上(或在4组你的情况),它被传递型“双规”的值,这将不适合在其“整数”的结果向量。


data.table可以代替累积结果,直到该组明智计算结束,并在必要时再进行类型转换,但这需要一堆额外的性能退化开销; 相反,它只是报告发生了什么,让你解决这个问题。 第一组运行后,并且它知道结果的类型,它分配该类型的结果矢量,只要基团的数目,然后进行填充。 如果以后发现,一些团体返回超过1项,它会生长(即重新分配)根据需要导致载体。 在大多数情况下,虽然, data.table用于结果的最终尺寸的第一猜测是正确的第一次(每组例如,1行的结果),因此快。

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

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



文章来源: Why does median trip up data.table (integer versus double)?