2016-05-10 3 views
1

最後のx時間に1行のIDが何回表示されるかを計算する関数がパッケージからあります。私はこれを「速度」と呼ぶでしょう。スライディングタイムウィンドウでIDごとに行を数えるには、Rで効率的な方法はありますか?

私が計算したいターゲット列は 'VEL_7H'で表されます。言い換えれば、このIDは過去7時間に何回出現したのでしょうか?

ID  TIME     VEL_7H 
1144727 2016-04-01 09:56:12 0 
1144727 2016-04-01 15:16:03 1 
1144727 2016-04-01 15:26:14 2 
1144727 2016-04-02 09:48:48 0 
1799567 2016-04-14 14:41:06 0 
1799567 2016-04-14 17:51:06 1 
2067650 2016-04-17 12:34:52 0 

VEL_7H列を与える時間ベクトルとIDベクトルと指定範囲を使用する関数はありますか?パフォーマンスを最大化するために

+0

あなたは 'dput(your_example)'を提供して、Rに簡単にコピー&ペーストできますか? – Frank

答えて

1

、私はRcppが適切であると思う:

library(Rcpp); 
df <- data.frame(ID=c(1144727L,1144727L,1144727L,1144727L,1799567L,1799567L,2067650L),TIME=as.POSIXct(c('2016-04-01 09:56:12','2016-04-01 15:16:03','2016-04-01 15:26:14','2016-04-02 09:48:48','2016-04-14 14:41:06','2016-04-14 17:51:06','2016-04-17 12:34:52'))); 
cppFunction(' 
    IntegerVector countTrailingIDs(IntegerVector ids, DoubleVector times, double window) { 
     IntegerVector res(ids.size()); 
     for (int i = 0; i < ids.size(); ++i) { 
      int id = ids[i]; 
      double trailTime = times[i]-window; 
      for (int j = i-1; j >= 0 && ids[j] == id && times[j] >= trailTime; --j) 
       ++res[i]; 
     } 
     return res; 
    } 
'); 
df$VEL_7H <- countTrailingIDs(df$ID,df$TIME,60*60*7); 
df; 
##  ID    TIME VEL_7H 
## 1 1144727 2016-04-01 09:56:12  0 
## 2 1144727 2016-04-01 15:16:03  1 
## 3 1144727 2016-04-01 15:26:14  2 
## 4 1144727 2016-04-02 09:48:48  0 
## 5 1799567 2016-04-14 14:41:06  0 
## 6 1799567 2016-04-14 17:51:06  1 
## 7 2067650 2016-04-17 12:34:52  0 

注関数はidと、時間に応じて注文するidstimesが必要であること。

+0

うわー。かなり速くてシンプル(1.6Mの速度を即座に計算)。解決していただきありがとうございます、私は答えを受け入れるでしょう。 – jbrettas

3

データフレームをIDで最初に分割し、最後の7時間のエントリ数を加算した後、値が

の新しい列を作成するために、ベースRで古典的な分割適用結合手法を使用できます
sdf <- split(df, df$ID) 
last7 <- function(df) sapply(1:nrow(df), function(i) sum(df[i, "TIME"] - df[1:i, "TIME"] <= 60*60*7) - 1L) 
df$VEL_7H <- unlist(sapply(sdf, last7)) 
df 
#  ID    TIME VEL_7H 
# 1 1144727 2016-04-01 09:56:12  0 
# 2 1144727 2016-04-01 15:16:03  1 
# 3 1144727 2016-04-01 15:26:14  2 
# 4 1144727 2016-04-02 09:48:48  0 
# 5 1799567 2016-04-14 14:41:06  0 
# 6 1799567 2016-04-14 17:51:06  1 
# 7 2067650 2016-04-17 12:34:52  0 
+0

ありがとうございます。これらの基底R関数が単純な解を提供するのを見て良かったです。私はまだ、このようなことをしているパッケージからは機能がないというのは奇妙だと思います。 Upvoted(: – jbrettas

関連する問題