在R中如何按时间部分对DataFrame的时间戳列排序?
问题:按时间戳的时间部分对DataFrame排序
首先确认你的输入数据:
structure(list(Time.stamp = structure(1:6, .Label = c("05/06/2016 21:13", "05/06/2016 22:52", "05/06/2016 22:58", "09/06/2016 22:40", "09/06/2016 22:45", "09/06/2016 22:50"), class = "factor")), .Names = "Time.stamp", class = "data.frame", row.names = c(NA, -6L))
你期望的是忽略日期,只按小时+分钟的时间部分排序,得到这样的结果:
05/06/2016 21:13 09/06/2016 22:40 09/06/2016 22:45 09/06/2016 22:50 05/06/2016 22:52 05/06/2016 22:58
你之前用lubridate的dmy_hm转换后直接排序无效,是因为转换后的是完整的日期时间对象,排序时会同时考虑日期和时间,而你要的是只基于时间部分排序。下面是两种可行的解决方法:
方法一:使用dplyr + lubridate
这个方法更简洁,适合熟悉tidyverse的用户:
library(lubridate) library(dplyr) # 加载你的数据 data <- structure(list(Time.stamp = structure(1:6, .Label = c("05/06/2016 21:13", "05/06/2016 22:52", "05/06/2016 22:58", "09/06/2016 22:40", "09/06/2016 22:45", "09/06/2016 22:50"), class = "factor")), .Names = "Time.stamp", class = "data.frame", row.names = c(NA, -6L)) # 转换日期时间、提取时间部分并排序 data_sorted <- data %>% # 将因子型的Time.stamp转为日期时间对象 mutate(datetime = dmy_hm(Time.stamp), # 提取时间部分(格式为HH:MM) time_part = format(datetime, "%H:%M")) %>% # 按时间部分排序 arrange(time_part) # 查看排序后的结果 data_sorted$Time.stamp
运行后会输出你想要的顺序:
[1] 05/06/2016 21:13 09/06/2016 22:40 09/06/2016 22:45 09/06/2016 22:50 05/06/2016 22:52 05/06/2016 22:58 Levels: 05/06/2016 21:13 05/06/2016 22:52 05/06/2016 22:58 09/06/2016 22:40 09/06/2016 22:45 09/06/2016 22:50
方法二:使用Base R(无需额外加载dplyr)
如果你更习惯base R的写法,可以用这个:
library(lubridate) # 加载数据 data <- structure(list(Time.stamp = structure(1:6, .Label = c("05/06/2016 21:13", "05/06/2016 22:52", "05/06/2016 22:58", "09/06/2016 22:40", "09/06/2016 22:45", "09/06/2016 22:50"), class = "factor")), .Names = "Time.stamp", class = "data.frame", row.names = c(NA, -6L)) # 转换为日期时间对象 data$datetime <- dmy_hm(data$Time.stamp) # 提取时间部分 data$time_part <- format(data$datetime, "%H:%M") # 按时间部分排序 data_sorted <- data[order(data$time_part), ] # 查看结果 data_sorted$Time.stamp
为什么你之前的方法无效?
你之前直接用dmy_hm转换后排序,是对完整的日期时间对象排序,比如05/06/2016 22:52的日期早于09/06/2016 22:40,所以完整排序时会把前者放在前面,但你需要的是忽略日期,只按小时分钟排序,因此必须先提取出时间部分,再基于这个字段排序。
内容的提问来源于stack exchange,提问作者Krishna Moorthy
相关产品推荐
相关产品推荐

