2014-02-26 20 views
0

嗨所有的R效率大師(和患有類似的問題對我來說),總結在另一個日期/時間參考向量POSIX(日期/時間)參考向量

這是一個效率的問題。我有一些非常大的數據集。一個data.frame包含來自一臺儀器的數據,其中POSIX日期和時間值非常高。另一個數據幀包含來自另一臺儀器的數據,其中一列日期和時間值的採樣頻率要低得多。

我希望將高頻數據幀的彙總值分配給低頻數據幀的時間段。此功能,但速度很慢,當你有幾百萬個數據點:

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

我想一些初步暗示將不會初始化'mns'爲'NULL'但作爲'代表(NA,長度(FIN))'(或類似的東西)和-instead'追加' - 用'mns [i] = ..'。另外,你可以只計算一次'vals [(tms> strt [i])&(tms

+0

感謝您的提示。我會嘗試一下。 – user2449710

回答

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 
+0

謝謝,我會給這個鏡頭,看看如何CPU時間比較 – user2449710

+0

看起來像使用這個版本消耗400000元素0.11秒的用戶時間,而我的原始消耗0.62。不錯! – user2449710

+0

@ user2449710 - 太棒了 - 我很想知道它是否/如何擴展到數百萬個案例。如果您正在處理大量數據並需要加快速度,那麼可能值得研究'data.table'包。 – thelatemail