在时间间隙插入 NA
Inserting NA's during time gaps
我有一个时间序列数据集,我正试图绘制它,但时间序列有很大的数据差距。绘制此数据集时,R 用直线绘制这些间隙,我希望最终图不要绘制这些数据间隙。我知道如何解决这个问题的唯一方法是在数据集中的间隙之间手动插入一行 NA。为此,我编写了一个循环遍历我的数据框的函数。该功能有效,但 运行.
速度很慢
#Define Function to Insert NA in long stretches so don't plot line
PlotSpace<-function(DF){
NROW<-nrow(DF)
for(t in seq(1:NROW)){
TimeDiff<-difftime(DF$TimeStamp[t+1], DF$TimeStamp[t], units = "hours")
DF[t,"TimeDiff"]<-TimeDiff
if( !is.na(TimeDiff) & TimeDiff > 5 ){
NewTimeStamp<-DF$TimeStamp[t] + 1
NewProfStamp<-DF$ProfStamp[t] + 1
print(NewTimeStamp)
DF<-rbind(DF,NA) #Add last row that is NA
DF[nrow(DF),'TimeStamp']<-NewTimeStamp
DF[nrow(DF),'ProfStamp']<-NewProfStamp
}
}
DF <- DF[order(DF$TimeStamp),]
DF<-DF[-1,]
DF$TimeStamp<-as.POSIXct(DF$TimeStamp)
return(DF)
}
在 R 中有更有效的方法吗?
示例数据:
TimeStamp<-c("2015-05-01 10:00:00","2015-05-01 10:05:00","2015-05-01 10:10:00","2015-05-01 10:15:00",
"2015-05-01 10:20:00","2015-05-01 15:00:00","2015-05-01 15:05:00","2015-05-01 15:10:00"
,"2015-05-01 15:20:00","2015-05-01 15:30:00","2015-05-01 15:35:00")
Data<-c(1,2,3,4,5,3,7,8,9,2,11)
DF<-data.frame(TimeStamp, Data)
DF$TimeStamp<-as.POSIXct(DF$TimeStamp)
plot(DF$TimeStamp, DF$Data, type='l')
如您所见,上图绘制了 7 小时数据差距之间的一条线。我想在大于 2 小时的任何时间差异之间插入一个 NA。又名
TimeStamp Data
1 2015-05-01 10:00:00 1
2 2015-05-01 10:05:00 2
3 2015-05-01 10:10:00 3
4 2015-05-01 10:15:00 4
5 2015-05-01 10:20:00 5
2015-05-01 10:21:00 NA
6 2015-05-01 15:00:00 3
7 2015-05-01 15:05:00 7
8 2015-05-01 15:10:00 8
9 2015-05-01 15:20:00 9
10 2015-05-01 15:30:00 2
11 2015-05-01 15:35:00 11
library(data.table)
setDT(DF)
# Create indicator for time gap
DF[, gap := c(diff(TimeStamp) > 2*60, F)]
# If there's a gap, add a new row
DF[, if(gap) rbind(.SD, .(TimeStamp = TimeStamp + 60), fill = T)
else .SD
, by = 1:nrow(DF)
][, -'gap']
# TimeStamp Data
# 1: 2015-05-01 10:00:00 1
# 2: 2015-05-01 10:05:00 2
# 3: 2015-05-01 10:10:00 3
# 4: 2015-05-01 10:15:00 4
# 5: 2015-05-01 10:20:00 5
# 6: 2015-05-01 10:21:00 NA
# 7: 2015-05-01 15:00:00 3
# 8: 2015-05-01 15:05:00 7
# 9: 2015-05-01 15:10:00 8
# 10: 2015-05-01 15:20:00 9
# 11: 2015-05-01 15:30:00 2
# 12: 2015-05-01 15:35:00 11
我有一个时间序列数据集,我正试图绘制它,但时间序列有很大的数据差距。绘制此数据集时,R 用直线绘制这些间隙,我希望最终图不要绘制这些数据间隙。我知道如何解决这个问题的唯一方法是在数据集中的间隙之间手动插入一行 NA。为此,我编写了一个循环遍历我的数据框的函数。该功能有效,但 运行.
速度很慢#Define Function to Insert NA in long stretches so don't plot line
PlotSpace<-function(DF){
NROW<-nrow(DF)
for(t in seq(1:NROW)){
TimeDiff<-difftime(DF$TimeStamp[t+1], DF$TimeStamp[t], units = "hours")
DF[t,"TimeDiff"]<-TimeDiff
if( !is.na(TimeDiff) & TimeDiff > 5 ){
NewTimeStamp<-DF$TimeStamp[t] + 1
NewProfStamp<-DF$ProfStamp[t] + 1
print(NewTimeStamp)
DF<-rbind(DF,NA) #Add last row that is NA
DF[nrow(DF),'TimeStamp']<-NewTimeStamp
DF[nrow(DF),'ProfStamp']<-NewProfStamp
}
}
DF <- DF[order(DF$TimeStamp),]
DF<-DF[-1,]
DF$TimeStamp<-as.POSIXct(DF$TimeStamp)
return(DF)
}
在 R 中有更有效的方法吗?
示例数据:
TimeStamp<-c("2015-05-01 10:00:00","2015-05-01 10:05:00","2015-05-01 10:10:00","2015-05-01 10:15:00",
"2015-05-01 10:20:00","2015-05-01 15:00:00","2015-05-01 15:05:00","2015-05-01 15:10:00"
,"2015-05-01 15:20:00","2015-05-01 15:30:00","2015-05-01 15:35:00")
Data<-c(1,2,3,4,5,3,7,8,9,2,11)
DF<-data.frame(TimeStamp, Data)
DF$TimeStamp<-as.POSIXct(DF$TimeStamp)
plot(DF$TimeStamp, DF$Data, type='l')
如您所见,上图绘制了 7 小时数据差距之间的一条线。我想在大于 2 小时的任何时间差异之间插入一个 NA。又名
TimeStamp Data
1 2015-05-01 10:00:00 1
2 2015-05-01 10:05:00 2
3 2015-05-01 10:10:00 3
4 2015-05-01 10:15:00 4
5 2015-05-01 10:20:00 5
2015-05-01 10:21:00 NA
6 2015-05-01 15:00:00 3
7 2015-05-01 15:05:00 7
8 2015-05-01 15:10:00 8
9 2015-05-01 15:20:00 9
10 2015-05-01 15:30:00 2
11 2015-05-01 15:35:00 11
library(data.table)
setDT(DF)
# Create indicator for time gap
DF[, gap := c(diff(TimeStamp) > 2*60, F)]
# If there's a gap, add a new row
DF[, if(gap) rbind(.SD, .(TimeStamp = TimeStamp + 60), fill = T)
else .SD
, by = 1:nrow(DF)
][, -'gap']
# TimeStamp Data
# 1: 2015-05-01 10:00:00 1
# 2: 2015-05-01 10:05:00 2
# 3: 2015-05-01 10:10:00 3
# 4: 2015-05-01 10:15:00 4
# 5: 2015-05-01 10:20:00 5
# 6: 2015-05-01 10:21:00 NA
# 7: 2015-05-01 15:00:00 3
# 8: 2015-05-01 15:05:00 7
# 9: 2015-05-01 15:10:00 8
# 10: 2015-05-01 15:20:00 9
# 11: 2015-05-01 15:30:00 2
# 12: 2015-05-01 15:35:00 11