我有一个名为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任何地方。
TL; DR包median
与as.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)))