Объекты даты POSIXct преобразуются с помощью apply()

У меня возникла проблема при работе с объектами POSIXct. При использовании функций, которые возвращают объекты POSIXct с помощью sapply(), sapply() автоматически преобразует их в числовые.

lapply(), похоже, поддерживает класс POSIXct, но когда я удаляю список(), я снова его теряю.

Есть ли способ воспользоваться функцией apply() при использовании POSIXct? У меня есть проект на работе с большим количеством информации о дате и времени, и я расстраиваюсь. Большое спасибо!

# unwanted POSIXct conversion to numeric
as.POSIXct(Sys.time(), "GMT") %>% rep(5) %>% sapply(function(x) x) 

# lapply seems to maintain POSIXct class, but if I unlist(), I lose POSIXct again
as.POSIXct(Sys.time(), "GMT") %>% rep(5) %>% lapply(function(x) x) 
as.POSIXct(Sys.time(), "GMT") %>% rep(5) %>% lapply(function(x) x) %>% unlist()

person Arthur    schedule 22.03.2019    source источник
comment
Думаю, я бы сначала проверил, чтобы убедиться, что вы не пропустили способы работы с векторами POSIXct с векторизацией, а не с *apply(), затем мне пришлось бы прибегнуть к do.call("c",myListOfPOSIXct).   -  person joran    schedule 22.03.2019
comment
Я думаю, проблема в том, что apply преобразование в matrix. Передача объекта POSIXct в matrix или as.matrix имеет тот же эффект.   -  person divibisan    schedule 22.03.2019
comment
^ Похоже, это та же проблема. Замена unlist на do.call(c, .) дает желаемый результат   -  person divibisan    schedule 22.03.2019
comment
Добавьте as.POSIXct(origin = ...) this в конец lapply или sapply: %>% as.POSIXct(origin = "1970-01-01 00:00 AM")   -  person shwan    schedule 22.03.2019
comment
Вы также можете сделать class(x) <- c("POSIXct", "POSIXt"). Непонятно, как здесь будет выглядеть реальный пример функции. Многие операции с датой и временем векторизуемы, как Sys.time() + 1 (все еще POSIXct)   -  person Frank    schedule 22.03.2019
comment
Я думаю, что настоящая WTF (и основная причина) заключается в том, почему unlist не сохраняет класс, но только, если ввод является списком. Это не относится ни к sapply, ни к POSIXct. Более того, поскольку это явно абсолютное базовое поведение языка в сочетании с S3, я озадачен тем, что не сталкивался с этим раньше. Дубликат не объясняет и не решает этот общий случай.   -  person Konrad Rudolph    schedule 22.03.2019


Ответы (1)


Я не уверен, что это самый эффективный способ, но в качестве быстрого решения вы можете сначала преобразовать их в символы.

as.POSIXct(sapply(rep(as.POSIXct(Sys.time(), "GMT"),5), function(x) as.character(x)))

## [1] "2019-03-22 19:24:37 CET" "2019-03-22 19:24:37 CET"
## [3] "2019-03-22 19:24:37 CET" "2019-03-22 19:24:37 CET"
## [5] "2019-03-22 19:24:37 CET"

Обновлять

Остается вопрос, зачем вообще нужен sapply?

 as.POSIXct(rep(Sys.time(),5))


##[1] "2019-03-22 19:29:40 CET" "2019-03-22 19:29:40 CET"
##[3] "2019-03-22 19:29:40 CET" "2019-03-22 19:29:40 CET"
##[5] "2019-03-22 19:29:40 CET"
person DJJ    schedule 22.03.2019
comment
Это был просто минимально воспроизводимый пример. Они хотят применить некоторую функцию к вектору из POSIXct объектов, не теряя при этом своего класса. - person divibisan; 22.03.2019
comment
Допустим, это может привести к более общим вопросам. Но это не было заявлено таким образом. Я цитирую. Есть ли способ воспользоваться функцией apply() при использовании POSIXct? У меня есть проект на работе с большим количеством информации о дате и времени, и я расстраиваюсь. Большое спасибо!. - person DJJ; 22.03.2019