我有数据.表名为enc.per.每天都有遭遇.它有2403行,其中指定了服务日期和当天就诊的患者人数.我想看看在任何工作日看到的患者的平均数量.

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

那条线出了一个错误

[.data.table中的误差(每天增加,列表(patient.Conferences=中位数(n)):

以下各项都很有效

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)

返回"整数".此外,数据中任何地方都没有NAs.桌子

推荐答案

TL;DR wrap 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人投诉,因为在判断了第一组要处理的值后,它得出结论,好的,这些结果将是"整数"类型.但是马上(或者在第4组中),它会被传递一个类型为"double"的值,该值不适合其"integer"结果向量.


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

在这种情况下,使用as.double(median(X))而不是median(X)提供了一个合适的解决方案.

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

R相关问答推荐

如何以编程方式将X轴勾号上的希腊符号合并到R图中?

在R中使用GG Plot时如何 suppress 等值线图中的彩色条

使用Shiny组合和显示复制和粘贴的数据

ggplot2中的X轴显示数值,单位为百,而不是十

为什么舍入POSIXct会更改能力以匹配等效的POSIXct?

如何在分组条形图中移动相关列?

2个Rscript.exe可执行文件有什么区别?

从圆到R中的多边形的标绘雷达图

Ggplot2中geom_tile的动态zoom

R中的类别比较

如果COLSUM为>;0,则COLNAME为向量

Geom_arcbar()中出错:找不到函数";geom_arcbar";

仅当后续值与特定值匹配时,才在列中回填Nas

使用列中的值来调用函数调用中应使用的其他列

删除字符串R中的重复项

如何在条形图中的x和填充变量中包含多个响应变量?

如何移动点以使它们的打印不重叠

R-如何在ggplot2中显示具有不同x轴值(日期)的多行?

分隔日期格式为2020年7月1日

重写时间间隔模糊连接以减少内存消耗