Предисловие:
У меня есть столбец в data.table значений difftime с единицами, установленными в днях. Я пытаюсь создать еще одну таблицу data.table, суммирующую значения с помощью
dt2 <- dt[, .(AvgTime = mean(DiffTime)), by = Group]
При печати новой таблицы данных я вижу такие значения, как
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()
возвращают предупреждение:
В mean(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.