r - 用r中的最大值和最小值组织数据

标签 r datetime group-by sqldf

我有一个这样的表:

enter image description here

由以下代码生成:

id <- c("1","2","1","2","1","1")
status <- c("open","open","closed","closed","open","closed")
date <- c("11-10-2017 15:10","10-10-2017 12:10","12-10-2017 22:10","13-10-2017 06:30","13-10-2017 09:30","13-10-2017 10:30")
data <- data.frame(id,status,date)
hour <- data.frame(do.call('rbind', strsplit(as.character(data$date),' ',fixed=TRUE)))
hour <- hour[,2]
hour <- as.POSIXlt(hour, format = "%H:%M") 

而我想要实现的是为每个id选择最早的开放时间最晚的关闭时间。所以最终的结果会是这样的:

enter image description here

目前我使用sqldf解决问题:

sqldf("select * from (select id, status, date as closeDate, max(hour) as hour from data 
  where status='closed'
   group by id,status) as a
   join 
   (select id, status, date  as openDate, min(hour) as hour from data 
   where status='open'
   group by id,status) as b
  using(id);")

问题 1:有没有更简单的方法?

问题 2: 如果我选择 max(hour) 作为任何其他名称而不是 hour,结果将不会是以下格式日期和时间,而是一系列数字,如 15078642001507807800。如何在为列分配不同名称的同时保持时间格式?

最佳答案

使用包plyr:

(由于某些原因,如 here 所示,您必须将小时转换为类 as.POSIXct,否则会收到错误消息):

#add hour to data.frame:
data$hour <- as.POSIXct(hour)
library(plyr)
ddply(data, .(id), summarize, open=min(hour[status=="open"]),
     closed=max(hour[status=="closed"]))

关于r - 用r中的最大值和最小值组织数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46717998/

相关文章:

r - 看起来像 donut 的圆形热图

c# - 在 C# 中使用 Nullable DateTime

java - 我无法将此字符串转换为日期

mysql - 选择最大列值为 : Managed to return correct answer but looking for cleaner imlementation 的行

java - Spring MongoDB 聚合组 - 无法正确获取组查询

sql - 基于一列对数据进行分组

r - 在 R 中填充矩阵

r - 在 r 中将 Lambert 共形圆锥投影转换为 wgs84

r - 从 akima::interp() 矩阵获取函数

python - 按时间间隔+聚合函数对 Pandas 进行分组