【问题标题】:Apply strptime to data.frame将 strptime 应用于 data.frame
【发布时间】:2018-11-30 08:18:40
【问题描述】:

我有一个 data.frame 对象,其中包含年、月和日的单独列。我想将其转换为一列 POSIXlt 类型的对象。所以我的 data.frame 看起来像

test_df <- data.frame(matrix(data = as.integer(c(1900,1900,1900,1,1,1,1,2,3)), 
                             nrow = 3, ncol = 3))
colnames(test_df) <- c("Year","Month","Day")

如果我尝试按以下方式转换单个行

paste(test_df$Year[1], test_df$Month[1], test_df$Day[1], sep = "/") %>%
as.factor() %>% 
strptime(format = "%Y/%m/%d")

我最终得到一个 POSIXlt 类对象。但是,如果我尝试使用这样的应用功能

test_df$date <- apply(test_df, 1, 
                      function(x) 
                      strptime(as.factor(paste(x[1], x[2], x[3], 
                                         sep = "/")), 
                               format = "%Y/%m/%d"))

我最终会在该新列中获得列表对象。在使用 apply 时我可以做些什么来维护 POSIXlt 类?

【问题讨论】:

  • strptime(paste(test_df$Year, test_df$Month, test_df$Day, sep = "/"), format = "%Y/%m/%d")
  • 或类似 Ronak 的,strptime(do.call(paste, test_df), format = '%Y %m %d')

标签: r apply strptime


【解决方案1】:

最好在数据帧中使用POSIXct 而不是POSIXlt。以下应该做同样的工作:

library(dplyr)

df <- test_df %>%
  mutate(date = as.POSIXct(paste(Year, Month, Day), format = "%Y %m %d"))

str(df)
# 'data.frame': 3 obs. of  4 variables:
#   $ Year : int  1900 1900 1900
# $ Month: int  1 1 1
# $ Day  : int  1 2 3
# $ date : POSIXct, format: "1900-01-01" "1900-01-02" "1900-01-03"

【讨论】:

  • 使用lubridatedf &lt;- test_df %&gt;% mutate(date = parse_date_time(paste(Year, Month, Day), "y m d"))稍作修改
  • 为什么在数据帧中使用 POSIXct 而不是 POSIXlt 更好?
  • @VictorMaxwell;它们的结构对于数据帧来说并不理想。 This post 应该提供更好的直觉。
猜你喜欢
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 2015-01-18
  • 2015-12-15
  • 2016-03-20
  • 2017-01-16
  • 1970-01-01
  • 2018-07-17
相关资源
最近更新 更多