当前位置: 首页 > 知识库问答 >
问题:

为什么中位数跳闸 data.table(整数与双精度)?

巫马昆琦
2023-03-14

我有数据。该表名为enc.per。每天的遭遇日。它有2403行,其中指定了服务日期和当天就诊的患者数量。我想看看在工作日中任何一种类型的患者的中位数。

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

这一行给出了一个错误

< code >[. data . table (enc . per . day,,list(patient . enches = median(n)),:j的列的计算结果与每个组的类型不一致:组4的结果具有类型为“integer”的列1,但类型应为“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.中的任何地方都没有NAs

共有1个答案

葛鸿熙
2023-03-14

太长别读中值as.double()

"data.table因为---即使只传递整数向量---有时返回一个整数值,有时返回一个双精度值。

## 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组),它被传递了一个“双精度”类型的值,这个值不适合它的“整数”结果向量。

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

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

(顺便说一下,您使用<code>round())

 类似资料:
  • 问题内容: 官方Javadoc 说,它返回“等于数学整数”的a,但是为什么它不应该返回a ? 问题答案: 根据同一Javadoc: 如果自变量是或无穷大或正零或负零,则结果与自变量相同。不能用。 最大的价值也比最大的大,所以它必须是一个。

  • 我试图得到一个double(由两个int的分数得到)作为我下面函数的返回值。 但结果总是错的,我得到的价值如: 预期结果应介于和 我的代码有什么问题! 谢谢

  • 我想用一个小数点和一个小数位的格式将任何双精度四舍五入为双精度,这样29575.347434将是2.3。 我试着用decimalFormat做这个,但当我试着我只得到了一个29575.3格式的字符串,带有一个,我不知道如何在保留值为双精度的同时去掉所有小数点。

  • 问题内容: 是否有可能做到这一点? 我知道代码可能不会去这样的事情,但怎么也去了? 问题答案: 这将检查双精度值的四舍五入值是否与双精度值相同。 你的变量可能具有或值,并且始终具有int值,因此,如果你的变量等于,则它必须具有int值。 如果变量的值是无穷大或负无穷大,那么这也不起作用,因此向条件添加“只要变量不是无穷大”。

  • 问题内容: 为什么会收到错误,我该如何解决? 如您所见,在声明变量时,我已经尝试过用顶部附近的位置进行替换,但是似乎并没有完成任务。 问题答案: 更改使用数组索引从double到INT所有变量(即变量,,)。数组索引是整数。

  • 本文向大家介绍在C#中将64位带符号整数重新解释为双精度浮点数,包括了在C#中将64位带符号整数重新解释为双精度浮点数的使用技巧和注意事项,需要的朋友参考一下 要将指定的64位带符号整数重新解释为双精度浮点数,代码如下- 示例 输出结果 这将产生以下输出- 示例 让我们看另一个例子- 输出结果 这将产生以下输出-