Преобразование столбцов в posixct с использованием sapply и сохранением формата даты и времени в R

Я хочу использовать sapply (или что-то подобное) для преобразования определенных столбцов в POSIXct в R data.frame, но при сохранении формата даты и времени столбцов. Когда я делаю это сейчас, он преобразует формат в числовой. Как я могу это сделать? Пример ниже.

#sample dataframe
df <- data.frame(
  var1=c(5, 2),
  char1=c('he', 'she'),
  timestamp1=c('2019-01-01 20:30:08', '2019-01-02 08:27:34'),
  timestamp2=c('2019-01-01 12:24:54', '2019-01-02 10:57:47'),
  stringsAsFactors = F
)

#Convert only columns with 'timestamp' in name to POSIXct
df[grep('timestamp', names(df))] <- sapply(df[grep('timestamp', names(df))], function(x) as.POSIXct(x, format='%Y-%m-%d %H:%M:%S'))
df
  var1 char1 timestamp1 timestamp2
1    5    he 1546392608 1546363494
2    2   she 1546435654 1546444667

Примечание: я могу использовать as.posixlt вместо as.posixct, и это работает, но мне нужны данные в формате POSIXct. Я также пробовал сначала преобразовать в POSIXlt, а затем в POSIXct, но это также закончилось преобразованием столбцов в числовые.


person Gaurav Bansal    schedule 04.11.2019    source источник


Ответы (1)


Используйте lapply вместо sapply. Буква «s» в sapply предназначена для упрощения и превращает результат в матрицу, но sapply не может создать матрицу значений POSIXct, поэтому она преобразуется в простую числовую матрицу. Но если вы сохраните его в списке, вы не потеряете класс.

df[grep('timestamp', names(df))] <- lapply(df[grep('timestamp', names(df))], function(x) as.POSIXct(x, format='%Y-%m-%d %H:%M:%S'))

Вы также можете легко сделать это с помощью dplyr

library(dplyr)
df %>% mutate_at(vars(contains("timestamp")), as.POSIXct)
person MrFlick    schedule 04.11.2019