【问题标题】:Grouped mean of difftime fails in data.tabledata.table 中 difftime 的分组平均值失败
【发布时间】:2017-11-13 18:14:35
【问题描述】:

前言:

我在 difftime 值的 data.table 中有一个列,其单位设置为天。我正在尝试创建另一个 data.table 来总结值与

dt2 <- dt[, .(AvgTime = mean(DiffTime)), by = Group]

打印新的 data.table 时,我看到诸如

之类的值
1.925988e+00 days
1.143287e+00 days
1.453975e+01 days

我只想限制此列的小数位值(即不设置 options(),除非我可以通过这种方式专门针对 difftime 值执行此操作)。当我尝试使用上述方法执行此操作时,已修改,例如

dt2 <- dt[, .(AvgTime = round(mean(DiffTime)), 2), by = Group]

我只剩下 NA 值,基本 round()format() 函数都返回警告:

平均(DiffTime):参数不是数字或逻辑。

奇怪的是,如果我对数字字段执行相同的操作,它运行起来没有问题。另外,如果我运行两行单独的代码,我可以完成我想做的事情:

dt2 <- dt[, .(AvgTime = mean(DiffTime)), by = Group]
dt2[, AvgTime := round(AvgTime, 2)]

可重现的例子:

library(data.table)
set.seed(1)
dt <- data.table(
  Date1 = 
    sample(seq(as.Date('2017/10/01'), 
               as.Date('2017/10/31'), 
               by="days"), 24, replace = FALSE) +
    abs(rnorm(24)) / 10,
  Date2 = 
    sample(seq(as.Date('2017/10/01'), 
               as.Date('2017/10/31'), 
               by="days"), 24, replace = FALSE) +
    abs(rnorm(24)) / 10,
  Num1 =
    abs(rnorm(24)) * 10,
  Group = 
    rep(LETTERS[1:4], each=6)
)
dt[, DiffTime := abs(difftime(Date1, Date2, units = 'days'))]

# Warnings/NA:
class(dt$DiffTime) # "difftime"
dt2 <- dt[, .(AvgTime = round(mean(DiffTime), 2)), by = .(Group)]

# Works when numeric/not difftime:
class(dt$Num1) # "numeric"
dt2 <- dt[, .(AvgNum = round(mean(Num1), 2)), by = .(Group)]

# Works, but takes an additional step:
dt2<-dt[,.(AvgTime = mean(DiffTime)), by = .(Group)]
dt2[,AvgTime := round(AvgTime,2)]

# Works with base::mean:
class(dt$DiffTime) # "difftime"
dt2 <- dt[, .(AvgTime = round(base::mean(DiffTime), 2)), by = .(Group)]

问题:

当班级为difftime时,为什么我无法一步完成此转换(均值四舍五入)?我在执行过程中遗漏了什么吗?这是data.table 中无法正确处理difftime 的某种错误吗?

github 上添加的问题。

更新: 从 data.table 版本 1.10.4 更新到 1.12.8 后,问题似乎已消除。

【问题讨论】:

    标签: r formatting data.table rounding difftime


    【解决方案1】:

    此问题已于 2019/05/15 更新 #3567 修复,data.table 版本 1.12.4 发布 2019/10/03

    【讨论】:

      【解决方案2】:

      这可能有点晚了,但如果你真的想要它工作,你可以这样做:

      as.numeric(round(as.difftime(difftime(DATE1, DATE2)), 0))
      

      【讨论】:

      • 此问题已通过更新 data.table 包得到修复。查看我的新答案/更新。
      【解决方案3】:

      我最近使用data.table_1.11.8 遇到了同样的问题。一种快速的解决方法是使用base::mean 而不是mean

      【讨论】:

      • 此问题已通过更新 data.table 包得到修复。查看我的新答案/更新。
      猜你喜欢
      • 2019-07-26
      • 2019-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      相关资源
      最近更新 更多