假设我有以下数据
plt <- seq(as.POSIXlt("2010-01-01 01:20:30"), as.POSIXlt("2010-12-31 12:00:30"),
length.out = 10)
df <- data.frame(plt)
plt
1 2010-01-01 01:20:30
2 2010-02-10 13:11:36
3 2010-03-23 02:02:43
4 2010-05-02 13:53:50
5 2010-06-12 01:44:56
6 2010-07-22 13:36:03
7 2010-09-01 01:27:10
8 2010-10-11 13:18:16
9 2010-11-21 00:09:23
10 2010-12-31 12:00:30
我要做的是按时间缩短以下日期。我的意思是我想在00:00:00 - 06:00:00,B因子到06:00:01 - 12:00:00,C因子到12:00:01的时间分配A因子 - 18:00:00,D因子至18:00:01 - 24:00:00希望在df
的单独列中找到这些因素。任何人都知道如何做到这一点?
答案 0 :(得分:3)
您可以使用POSXlt信息提取小时,然后使用cut()
创建分组
df$timeclass <- cut(as.POSIXlt(df$plt)$hour,
breaks=c(0,6,12,18,24),
labels=c("A","B","C","D"),
include.lowest=T)
df
# plt timeclass
# 1 2010-01-01 01:20:30 A
# 2 2010-02-10 13:11:36 C
# 3 2010-03-23 02:02:43 A
# 4 2010-05-02 13:53:50 C
# 5 2010-06-12 01:44:56 A
# 6 2010-07-22 13:36:03 C
# 7 2010-09-01 01:27:10 A
# 8 2010-10-11 13:18:16 C
# 9 2010-11-21 00:09:23 A
# 10 2010-12-31 12:00:30 B
答案 1 :(得分:1)
尝试以下
library(data.table)
setDT(df) # converts df to a data.table
## Broken down into steps
df[, plt_numb := as.numeric(plt)]
df[, groups := ((plt_numb - 1) %% 86400) %/% 21600]
df[, group_factors := factor(groups, levels=0:3, labels=c("A", "B", "C", "D"))]
只需一步:
df[, newCols :=
factor({((as.numeric(plt) - 1) %% 86400) %/% 21600}
, levels = 0:3
, labels = c("A", "B", "C", "D")
)]
请注意
* 86400 == 24小时* 60分钟* 60秒
* 21600 == 6小时* 60分钟* 60秒
因此,取模86400只产生时间值;取余数除以21600将值组成3组。
答案 2 :(得分:1)
您可以使用lubridate
让您的生活更轻松。可能有一种更好的方法可以做到这一点,但我认为这种方式最容易阅读。
library(lubridate)
df$time_factor <- as.factor(sapply(df$plt, function(x) {
date_x <- floor_date(x, "day")
if(x < date_x + hours(6)){ # time is 6am
return("A")
}
if(x < date_x + hours(12)){ # time is midday
return("B")
}
if(x < date_x + hours(18)){ # time is 6pm
return("C")
}
if(x < date_x + hours(24)){
return("D")
}
}))