3

data.table実装(またはasofとしても知られています)は、箱から出して結合します。私はこの関連する質問を見つけました:rollingLOCF

カテゴリごとに、データテーブルの欠落している(空白)を埋める-後方および前方

しかし、その質問にはデータにNAが含まれています。私の場合、データを不規則に保ち、を使用してデータに結合するために、そこでのアドバイスに従っていroll=TRUEます。最後に繰り越された観測の代わりにやりたいのは、次の観測を可能な限り効率的に繰り越すことです。

これは私が試したもので、time:=-time最初にそれをだましてみました。もっと上手くできますか?もっと速くできますか?

llorJoin <- function(A,B){
    B <- copy(B);
    keys <- key(A);
    if( !identical(key(A), key(B)) | is.null(keys) ){
       stop("llorJoin::ERROR; A and B should have the same non-empty keys");
    }

    lastKey <- tail(keys,1L);
    myStr <- parse(text=paste0(lastKey,":=-as.numeric(",lastKey,")"));
    A <- A[,eval(myStr)]; setkeyv(A,keys);
    B <- B[,eval(myStr)]; setkeyv(B,keys);

    origin <- "1970-01-01 00:00.00 UTC";
    A <- B[A,roll=T];
    myStr2 <- parse(text=paste0(lastKey,":=as.POSIXct(-",lastKey,",origin=origin)"));
    A <- A[,eval(myStr2)]; setkeyv(A,keys);
    return(A);
}

library(data.table)
A <- data.table(time=as.POSIXct(c("10:01:01","10:01:02","10:01:04","10:01:05","10:01:02","10:01:01","10:01:01"),format="%H:%M:%S"),
                b=c("a","a","a","a","b","c","c"),
                d=c(1,1.9,2,1.8,5,4.1,4.2));
B <- data.table(time=as.POSIXct(c("10:01:01","10:01:03","10:01:00","10:01:01"),format="%H:%M:%S"),b=c("a","a","c","d"), e=c(1L,2L,3L,4L));
setkey(A,b,time)
setkey(B,b,time)

library(rbenchmark)
benchmark(llorJoin(A,B),B[A,roll=T],replications=10)
            test replications elapsed relative user.self sys.self user.child sys.child
1 llorJoin(A, B)           10   0.045        1     0.048        0          0         0
2 B[A, roll = T]           10   0.009        1     0.008        0          0         0

   b                time  e   d
1: a 2013-01-12 09:01:01  1 1.0
2: a 2013-01-12 09:01:02  2 1.9
3: a 2013-01-12 09:01:04 NA 2.0
4: a 2013-01-12 09:01:05 NA 1.8
5: b 2013-01-12 09:01:02 NA 5.0
6: c 2013-01-12 09:01:01 NA 4.1
7: c 2013-01-12 09:01:01 NA 4.2

したがって、比較として、初期データのasof結合は5倍高速です。

4

1 に答える 1

4

roll引数はずっと前からnocbを実行できます。#615を閉じることができるように、この回答を更新します。

キーを設定する必要もなくなりました。代わりに、引数を使用して結合する列を指定できますon=( で実装v1.9.6)。これら 2 つの機能を使用すると、次のようにタスクを実行できます。

require(data.table) # v1.9.6+
A[B, on=c("b", "time"), roll=-Inf]
#                   time b  e   d
# 1: 2015-10-11 10:01:01 a  1 1.0
# 2: 2015-10-11 10:01:02 a  2 1.9
# 3: 2015-10-11 10:01:04 a NA 2.0
# 4: 2015-10-11 10:01:05 a NA 1.8
# 5: 2015-10-11 10:01:02 b NA 5.0
# 6: 2015-10-11 10:01:01 c NA 4.1
# 7: 2015-10-11 10:01:01 c NA 4.2

それでおしまい。


に変更することなく、最速の方法にかなり近づいていますdata.table。次の機能リクエストは、しばらく前に提出されました。

FR#2300 roll=TRUE に backwards と firstback を追加

この質問へのリンクを追加しました。R-Forge で機能リクエスト リストを検索できます。この場合、「roll」、「forwards」、「backwards」などの単語がすべて見つかります。バグまたは機能要求がまだ提出されていないことを確認するために、4 ~ 5 回の検索試行が必要になる場合があります。

おそらく、可能な限り迅速な回避策を試して提供するよりも、その機能要求を実装する方が早いでしょう (内部的には数行しか必要ありません)。

于 2013-01-13T11:40:34.697 に答える