首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据时间范围在R数据框中添加分组列

如何根据时间范围在R数据框中添加分组列
EN

Stack Overflow用户
提问于 2021-01-15 21:27:35
回答 1查看 42关注 0票数 0

我在R中有一个数据帧(数千行),其中包含这样的数据。

代码语言:javascript
复制
"id","ts"
1,2010-11-11 06:00:00
2,2010-11-11 06:01:00
3,2010-11-11 06:02:00
4,2010-11-11 06:03:00
...
11,2010-11-11 06:10:00
12,2010-11-11 06:11:00
13,2010-11-11 06:12:00
14,2010-11-11 06:13:00
15,2010-11-11 06:14:00
16,2010-11-11 06:15:00
17,2010-11-11 10:00:00
18,2010-11-11 10:01:00
19,2010-11-11 10:02:00
20,2010-11-11 10:03:00
21,2010-11-11 10:04:00
22,2010-11-11 10:05:00
...

我有很多天(2010年11月11日-2010年12月15日)的数据。理想情况下,每天在下面给出的范围之间的三个时隙中都有时间戳数据(as.POSIXct, tz = "UTC")。然而,有些日子只有一个或两个时隙的数据。

代码语言:javascript
复制
Slot1: 06:00:00 - 06:15:00
Slot2: 10:00:00 - 10:15:00
Slot3: 13:00:00 - 13:15:00

我想做的是,添加一个基于上述三个时间范围的组列(截至2010年12月15日的连续组号数据)。预期输出为:

代码语言:javascript
复制
"id","ts","Group"
1,2010-11-11 06:00:00,1
2,2010-11-11 06:01:00,1
3,2010-11-11 06:02:00,1
4,2010-11-11 06:03:00,1
...
11,2010-11-11 06:10:00,1
12,2010-11-11 06:11:00,1
13,2010-11-11 06:12:00,1
14,2010-11-11 06:13:00,1
15,2010-11-11 06:14:00,1
16,2010-11-11 06:15:00,1
17,2010-11-11 10:00:00,2
18,2010-11-11 10:01:00,2
19,2010-11-11 10:02:00,2
20,2010-11-11 10:03:00,2
21,2010-11-11 10:04:00,2
22,2010-11-11 10:05:00,2
...

如何在R中实现这一点?

下面是一些可重现的样本数据:

代码语言:javascript
复制
start1  <- as.POSIXct("2010-11-11 06:00:00 UTC")
end1    <- as.POSIXct("2010-11-11 06:15:00 UTC")
start2  <- as.POSIXct("2010-11-11 10:00:00 UTC")
end2    <- as.POSIXct("2010-11-11 10:15:00 UTC")
start3  <- as.POSIXct("2010-11-11 13:00:00 UTC")
end3    <- as.POSIXct("2010-11-11 13:15:00 UTC")
ts1     <- data.frame(ts=seq.POSIXt(start1,end1, by = "min"))
ts2     <- data.frame(ts=seq.POSIXt(start2,end2, by = "min"))
ts3     <- data.frame(ts=seq.POSIXt(start3,end3, by = "min"))
ts      <- data.frame(rbind(ts1,ts2,ts3))
id      <- data.frame(id=seq.int(1,48,1))
dat     <- data.frame(cbind(id,ts))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-15 21:34:03

您可以从ts中提取小时和分钟值,并使用case_when来应用Group数字。

代码语言:javascript
复制
library(dplyr)
library(lubridate)

dat %>%
  arrange(ts) %>%
  mutate(hour = hour(ts), 
         minute = minute(ts), 
         date = as.Date(ts),
         Group =  case_when(hour == 6 & minute <= 15 ~ 1L, 
                           hour == 10 & minute <= 15 ~ 2L,
                           hour == 13 & minute <= 15 ~ 3L),
         Group = (as.integer(date - min(date)) * 3) + Group, 
         Group = match(Group, unique(Group))) -> result

result

你可以使用select,也就是result %>% select(id, ts, Group)来保存你想要的列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65736947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档