r - 使用 sapply 将列转换为 posixct 并在 R 中保留日期时间格式

标签 r posixct

我想使用 sapply (或类似的东西)将 R data.frame 中的某些列转换为 POSIXct,但保持列的日期时间格式。当我当前执行此操作时,它将格式转换为数字。我怎样才能做到这一点?下面是一个例子。

#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,但这最终也将列转换为数字。

最佳答案

使用lapply而不是sapply。 sapply 中的“s”用于简化,它将结果转换为矩阵,但 sapply 无法创建 POSIXct 值的矩阵,因此它会转换为简单的数字矩阵。但如果你将其保留为一个列表,你就不会失去类(class)。

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)

关于r - 使用 sapply 将列转换为 posixct 并在 R 中保留日期时间格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58696675/

相关文章:

R 如何使用 ifelse 函数在多列中搜索字符串值?

xml - 绕过循环函数中的错误(用于从 Twitter 中提取数据)

R,在 Shiny 和 ggvis 中绘制日期的问题

r - 在不改变显示的情况下修改 POSIXct 对象的时区

r - 按特定时间切割 POSIXct 以获取日常方法

r - as.POSIXct 拒绝 +1300 时区

r - 在 r 中为组的平均值创建折线图

r - heatmap.2 顶部有颜色键

r - 测试 R Shiny 中一组编号输入对象中的任何输入是否为空

regex - 如何最有效地将 "01 Jan 2014"的字符串转换为 POSIXct,即 "2014-01-01"yyyy-mm-dd