0

こんにちは、すべての R 効率の専門家 (および私と同様の質問を持つ人々)。

これは効率の問題です。非常に大きなデータセットがあります。1 つの data.frame には、非常に高い頻度で値を持つ POSIX 日付と時刻を持つ 1 つの機器からのデータが含まれています。別の 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)

より効率的で高速なアプローチについて提案がある人はいますか?

4

1 に答える 1

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
于 2014-02-27T00:29:13.577 に答える