6

data.table日付を結合として2つ結合したいと思います。

まあ、時々私は完全に一致していませんでした、そしてこの場合私は最も近いより少ない日付を見つけたいです。私の問題は、 SQLに関するこの投稿と非常によく似ています。

data.table構文がSQLに類似していることは知っていますが、これをコーディングすることはできません。正しい構文は何ですか?

簡単な例:

Dt1 
   date      x
1/26/2010 - 10  
1/25/2010 - 9  
1/24/2010 - 9   
1/22/2010 - 7    
1/19/2010 - 11

Dt2
   date
1/26/2010   
1/23/2010   
1/20/2010  

出力

   date     x
1/26/2010 - 10  
1/23/2010 - 7 
1/20/2010 - 11

前もって感謝します。

4

2 に答える 2

6

どうぞ:

library(data.table)

データを作成します。

Dt1 <- read.table(text="
date      x
1/26/2010,  10  
1/25/2010,  9  
1/24/2010,  9   
1/22/2010,  7    
1/19/2010,  11", header=TRUE, stringsAsFactors=FALSE)

Dt2 <- read.table(text="
date
1/26/2010   
1/23/2010   
1/20/2010", header=TRUE, stringsAsFactors=FALSE)

に変換しdata.table、文字列を日付に変換し、data.tableキーを設定します。

Dt1 <- data.table(Dt1)
Dt2 <- data.table(Dt2)

Dt1[, date:=as.Date(date, format=("%m/%d/%Y"))]
Dt2[, date:=as.Date(date, format=("%m/%d/%Y"))]

setkey(Dt1, date)
setkey(Dt2, date)

を使用してテーブルを結合しroll=TRUEます。

Dt1[Dt2, roll=TRUE]

           date  x
[1,] 2010-01-20 11
[2,] 2010-01-23  7
[3,] 2010-01-26 10
于 2012-07-05T10:58:30.700 に答える
2
?data.table                  # search for the `roll` argument
example(data.table)          # search for the example using roll=TRUE
vignette("datatable-intro")  # see section "3: Fast time series join" 
vignette("datatable-faq")    # see FAQs 2.16 and 2.20

これは、の主な機能の1つですdata.table。行は(SQLとは異なり)順序付けられているため、この操作は単純で非常に高速です。SQLは本質的に順序付けされていないため、このタスクを実行するには、自己結合と「順序付け」が必要です。これはSQLで実行でき、機能しますが、速度が遅く、より多くのコードが必要になる可能性があります。SQLは行ストアであるため、メモリ内SQLであっても、RAMからL2キャッシュへのページフェッチによって決定される下限があります。data.table列ストアであるため、その下限を下回っています。

2つのビネットもホームページにあります。

于 2012-07-05T10:28:37.657 に答える