【发布时间】:2017-10-10 22:42:40
【问题描述】:
我有一个xts格式的数据(data)看起来是这样的:
A
2008-01-14 09:29:59 10
2008-01-14 09:29:59 0.1
2008-01-14 09:30:00 0.9
2008-01-14 09:30:00 0.1
2008-01-14 09:30:00 0.2
2008-01-14 09:30:00 0.4
2008-01-14 09:30:00 0.6
2008-01-14 09:30:00 0.7
2008-01-14 09:30:02 1.5
2008-01-14 09:30:06 0.1
2008-01-14 09:30:06 0.1
2008-01-14 09:30:07 0.9
2008-01-14 09:30:07 0.2
2008-01-14 09:30:10 0.4
2008-01-14 09:30:10 0.3
2008-01-14 09:30:25 1.5
任何列或行元素中都没有模式。
数据由 POSIXct 类对象索引。我正在创建名为“1second”、“3second”的新列。对于“1秒”列,对于每一行,我想根据他们的xts时间对象在接下来的1秒内找到下一个观察值,并记录该行的“A”值。如果在接下来的几秒钟内没有观察到,则将 NA 放入该行的 data$1second 中。
同样,对于“3second”列,对于每一行,我想根据他们的 xts 时间对象在接下来的 3 秒内找到领先的观察。如果在接下来的 3 秒内有多行具有相同的时间戳,则仅使用最后一次观察。
如果在接下来的 3 秒内没有观察到,则将 NA 放入该行的 data$3second 中。 例如,我期望得到以下结果:
B 1second 3second
2008-01-14 09:29:59 10 0.7 1.5
2008-01-14 09:29:59 0.1 0.7 1.5
2008-01-14 09:30:00 0.9 NA 1.5
2008-01-14 09:30:00 0.1 NA 1.5
2008-01-14 09:30:00 0.2 NA 1.5
2008-01-14 09:30:00 0.4 NA 1.5
2008-01-14 09:30:00 0.6 NA 1.5
2008-01-14 09:30:00 0.7 NA 1.5
2008-01-14 09:30:02 1.5 NA NA
2008-01-14 09:30:06 0.1 0.2 0.2
2008-01-14 09:30:06 0.1 0.2 0.2
2008-01-14 09:30:07 0.9 NA 0.3
2008-01-14 09:30:07 0.2 NA 0.3
2008-01-14 09:30:10 0.4 NA 0.3
2008-01-14 09:30:10 0.3 NA NA
2008-01-14 09:30:25 1.5 NA NA
这是我当前的代码,它可以工作,但速度很慢。
TimeStmp is the POSIXct object.
TimeHorizon<-c(1,3)
for( j in 1:nrow(data)){
a<-sapply(TimeHorizon,function(x) which(TimeStmp==TimeStmp[j] +x))
for( k in 1:length(a)){
if (length(a[[k]]>0)){
data[j,k+1]<-(data$B)[last(a[[k]])]
}
}
}
我想知道是否可以使用 Rcpp 来避免使用 for 循环。非常感谢您的帮助。
【问题讨论】:
标签: r function for-loop rcpp xts