嗨所有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)
有没有人建议采用更有效,更快捷的方法?
答案 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