初学者:在R中设置时间序列
我对R是全新的,我很难想出如何建立一个简单的时间序列。 插图:假设我有三个变量:事件(0或1)、HR(心率)、DT(日期时间): 我想做的是计算每个新事件之后经过的时间:所以,row1=0分钟,row2=15,row3=60,。。。第5行=0,第6行=60,然后我可以做一些事情,比如绘制HR与经过的时间 计算经过时间的简单方法是什么?初学者:在R中设置时间序列,r,time-series,R,Time Series,我对R是全新的,我很难想出如何建立一个简单的时间序列。 插图:假设我有三个变量:事件(0或1)、HR(心率)、DT(日期时间): 我想做的是计算每个新事件之后经过的时间:所以,row1=0分钟,row2=15,row3=60,。。。第5行=0,第6行=60,然后我可以做一些事情,比如绘制HR与经过的时间 计算经过时间的简单方法是什么? 对于这样一个低级的问题,我深表歉意,但如果有任何帮助,我将不胜感激 以下内容使用Chron库并将日期/时间列转换为时间对象,以便库能够运行计算和转换 示例数据:
对于这样一个低级的问题,我深表歉意,但如果有任何帮助,我将不胜感激 以下内容使用
Chron
库并将日期/时间列转换为时间对象,以便库能够运行计算和转换
示例数据:
df <- data.frame(
Event=c(1,0,0,0,1,0,0),
HR=c(100,125,115,105,105,115,100),
DT=c("2020-01-01 09:00:00"
,"2020-01-01 09:15:00"
,"2020-01-01 10:00:00"
,"2020-01-01 10:30:00"
,"2020-01-01 11:00:00"
,"2020-01-01 12:00:00"
,"2020-01-01 13:00:00"))
欢迎来到Stack Overflow@greyguy。 以下是一种使用
dplyr
library的方法,它非常适合处理大型数据集:
library(dplyr)
#Yours Data
df = data.frame(Event = c(1,0,0,0,1,0,0),
HR= c(100,120,115,105,105,115,100),
DT= c("2020-01-01 09:00:00","2020-01-01 09:15:00","2020-01-01 10:00:00","2020-01-01 10:30:00",
"2020-01-01 11:00:00","2020-01-01 12:00:00","2020-01-01 13:00:00"),
stringsAsFactors = F
)
# Transform in time format not string and order by time if not ordered
转换为时间格式,而不是字符串,如果未排序,则按时间排序
输出:
# Event HR DT Elapsed_min
# 1 100 2020-01-01 09:00:00 0
# 0 120 2020-01-01 09:15:00 15
# 0 115 2020-01-01 10:00:00 60
# 0 105 2020-01-01 10:30:00 90
# 1 105 2020-01-01 11:00:00 0
# 0 115 2020-01-01 12:00:00 60
# 0 100 2020-01-01 13:00:00 120
下面是一个使用data.table的单行方法 数据:
df <- structure(list(Event = c(1, 0, 0, 0, 1, 0, 0), HR = c(100, 120,
115, 105, 105, 115, 100), DT = structure(c(1577869200, 1577870100,
1577872800, 1577874600, 1577876400, 1577880000, 1577883600), class = c("POSIXct",
"POSIXt"), tzone = "UTC")), row.names = c(NA, -7L), class = "data.frame")
library(data.table)
dt <- as.data.table(df)
dt[, mins_since_last_event := as.numeric(difftime(DT,DT[1],units = "mins")), by = .(cumsum(Event))]
dt
Event HR DT mins_since_last_event
1: 1 100 2020-01-01 09:00:00 0
2: 0 120 2020-01-01 09:15:00 15
3: 0 115 2020-01-01 10:00:00 60
4: 0 105 2020-01-01 10:30:00 90
5: 1 105 2020-01-01 11:00:00 0
6: 0 115 2020-01-01 12:00:00 60
7: 0 100 2020-01-01 13:00:00 120
你尝试过什么,它是如何失败的?我主要尝试过在timeseries(比如ts)上阅读文档,但我没有看到任何类似的东西。很高兴能朝着有成效的方向努力。我认为有一些错误。第3行中的最小值应该是60。谢谢@ IcAMAMBELL,我忘了考虑LASSTYVENT=1,并采取。谢谢!需要对此进行研究。但是,在这两个示例中,当出现新事件时,第5行中的TimeAppead没有重置为0。我已更新了答案以反映您的澄清。
df = df %>%
mutate(DT = as.POSIXct(DT, format = "%Y-%m-%d %H:%M:%S")) %>%
arrange(DT) %>%
mutate(#Litte trick to get last DT Observation
last_DT = case_when(Event==1 ~ DT),
last_DT = na.locf(last_DT),
Elapsed_min = as.numeric( (DT - last_DT)/60)
) %>%
select(-last_DT)
# Event HR DT Elapsed_min
# 1 100 2020-01-01 09:00:00 0
# 0 120 2020-01-01 09:15:00 15
# 0 115 2020-01-01 10:00:00 60
# 0 105 2020-01-01 10:30:00 90
# 1 105 2020-01-01 11:00:00 0
# 0 115 2020-01-01 12:00:00 60
# 0 100 2020-01-01 13:00:00 120
df <- structure(list(Event = c(1, 0, 0, 0, 1, 0, 0), HR = c(100, 120,
115, 105, 105, 115, 100), DT = structure(c(1577869200, 1577870100,
1577872800, 1577874600, 1577876400, 1577880000, 1577883600), class = c("POSIXct",
"POSIXt"), tzone = "UTC")), row.names = c(NA, -7L), class = "data.frame")
library(data.table)
dt <- as.data.table(df)
dt[, mins_since_last_event := as.numeric(difftime(DT,DT[1],units = "mins")), by = .(cumsum(Event))]
dt
Event HR DT mins_since_last_event
1: 1 100 2020-01-01 09:00:00 0
2: 0 120 2020-01-01 09:15:00 15
3: 0 115 2020-01-01 10:00:00 60
4: 0 105 2020-01-01 10:30:00 90
5: 1 105 2020-01-01 11:00:00 0
6: 0 115 2020-01-01 12:00:00 60
7: 0 100 2020-01-01 13:00:00 120