difftime 的分组平均值在 data.table 中失败
Grouped mean of difftime fails in data.table
前言:
我在 data.table 中有一列 difftime 值,单位设置为天。我正在尝试创建另一个 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()
函数返回警告:
In mean(DiffTime) : argument is not numeric or logical.
奇怪的是,如果我对数字字段执行相同的操作,这 运行s 没有问题。此外,如果我 运行 两行单独的代码,我可以完成我想要做的事情:
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)]
问题:
当 class 为 difftime
时,为什么我无法一步 完成此转换(均值四舍五入)?我在执行过程中遗漏了什么吗?这是 data.table
中无法正确处理 difftime
的某种错误吗?
问题已添加到 github。
更新: 从 data.table 版本 1.10.4 更新到 后问题似乎已解决1.12.8.
这可能有点晚了,但如果你真的想让它工作,你可以这样做:
as.numeric(round(as.difftime(difftime(DATE1, DATE2)), 0))
我最近 运行 使用 data.table_1.11.8
遇到了同样的问题。一种快速解决方法是使用 base::mean
而不是 mean
。
更新已解决此问题 #3567 on 2019/05/15, data.table version 1.12.4 released 2019/10/03
前言:
我在 data.table 中有一列 difftime 值,单位设置为天。我正在尝试创建另一个 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()
函数返回警告:
In mean(DiffTime) : argument is not numeric or logical.
奇怪的是,如果我对数字字段执行相同的操作,这 运行s 没有问题。此外,如果我 运行 两行单独的代码,我可以完成我想要做的事情:
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)]
问题:
当 class 为 difftime
时,为什么我无法一步 完成此转换(均值四舍五入)?我在执行过程中遗漏了什么吗?这是 data.table
中无法正确处理 difftime
的某种错误吗?
问题已添加到 github。
更新: 从 data.table 版本 1.10.4 更新到 后问题似乎已解决1.12.8.
这可能有点晚了,但如果你真的想让它工作,你可以这样做:
as.numeric(round(as.difftime(difftime(DATE1, DATE2)), 0))
我最近 运行 使用 data.table_1.11.8
遇到了同样的问题。一种快速解决方法是使用 base::mean
而不是 mean
。
更新已解决此问题 #3567 on 2019/05/15, data.table version 1.12.4 released 2019/10/03