Сбой группового среднего значения difftime в data.table

Предисловие:

У меня есть столбец в 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.


person Gaffi    schedule 13.11.2017    source источник


Ответы (3)


Это было исправлено обновлением #3567 от 15 мая 2019 г., data. версия таблицы 1.12.4 выпущена 03.10.2019

person Gaffi    schedule 23.01.2020

Это может быть немного поздно, но если вы действительно хотите, чтобы это сработало, вы можете сделать:

as.numeric(round(as.difftime(difftime(DATE1, DATE2)), 0))
person Alexis Drakopoulos    schedule 16.08.2018
comment
Это было исправлено в обновлении пакета data.table. Смотрите мой новый ответ/обновление. - person Gaffi; 03.02.2020

Недавно я столкнулся с той же проблемой, используя data.table_1.11.8. Один быстрый обходной путь — использовать base::mean вместо mean.

person Matt Motoki    schedule 11.12.2018
comment
Это было исправлено в обновлении пакета data.table. Смотрите мой новый ответ/обновление. - person Gaffi; 03.02.2020