在另一个日期/时间参考向量中汇总POSIX(日期/时间)参考向量

时间:2014-02-26 23:47:59

标签: r posixct downsampling

嗨所有R效率专家(以及对我有类似问题的人),

这是一个效率问题。我有一些非常大的数据集。一个data.frame包含来自一个具有POSIX日期和时间的仪器的数据,其值具有非常高的频率。另一个data.frame包含来自另一个仪器的数据,其中一列日期和时间值的采样频率要低得多。

我希望将高频数据帧的汇总值分配给低频data.frame的时间段。此功能有效,但当您拥有数百万个数据点时速度非常慢:

st <- strptime("22/09/2013 12:00:00", "%d/%m/%Y %H:%M:%S")
st.vec <- st + runif(10,0, 60*60*24)
en.vec <- st.vec + 10*60
tm.hfreq <- strptime("22/09/2013 12:00:00", "%d/%m/%Y %H:%M:%S") + runif(400,0,     60*60*24)
vals.hfreq <-  runif(400,0, 12000)

intervalstats <- function(strt, fin, vals, tms){
  mns <- NULL
  mds <- NULL
  sds <- NULL
  for (i in seq(1,length(fin))){
    mns <- append(mns,mean(vals[(tms > strt[i])&(tms < fin[i])]))
    sds <- append(sds,sd(vals[(tms > strt[i])&(tms < fin[i])]))
    mds <- append(mds,median(vals[(tms > strt[i])&(tms < fin[i])]))

}
  res <- cbind(mns, sds, mds)  
  res 
}

intervalstats(st.vec, en.vec, vals.hfreq, tm.hfreq)

有没有人建议采用更有效,更快捷的方法?

1 个答案:

答案 0 :(得分:1)

您可以使用apply方法查看每一行。我确实需要使用as.numeric转换日期,以便它可以正常工作。类似的东西:

lofreq <- data.frame(st.vec,en.vec)
lofreq <- sapply(lofreq, as.numeric)
hifreq <- data.frame(tm.hfreq=as.numeric(tm.hfreq),vals.hfreq)

t(apply(
  lofreq,
  1,
  function(x) {
    out <- hifreq$vals.hfreq[hifreq$tm.hfreq > x[1] & hifreq$tm.hfreq < x[2]]
    c(mns=mean(out), sds=sd(out), mds=median(out))
  }
))

#           mns       sds      mds
# [1,] 8610.664 3179.3055 9392.312
# [2,] 9398.725  844.6824 9039.992
# [3,] 6159.502 3900.0839 6159.502
# [4,] 6428.173 5802.1844 6428.173
# [5,] 5446.384 4770.9478 6783.228
# [6,] 6309.637 2017.6561 6503.751
# [7,] 6312.746 2354.9198 5553.370
# [8,] 4461.549        NA 4461.549
# [9,] 4486.433 6263.8853 4486.433
#[10,] 7279.241 1520.4536 7279.241