2017-09-10 14 views
0

上の条件との合併:Merge two dataframes with condition on timestamp しかし、私の質問より一般的ではなく、時系列固有のここに未回答の質問に似た2つのデータフレーム

私はから2列上の近接状態でマージする2つのデータフレームを持っています両方のデータフレーム。 SQLで私は、Rに上記を行うためのcanincal方法である私が探しているものを

merge(x,y,by='user', condition = x$label - y$label <=2) 

はとても以下はなしでなければなりませんlike-何かを

select * from (select * from A) T1 inner join (select * from B) T2 on T1.user = T2.user and T1.label - T2.label < 2

ような何かをやっているだろう行ベースのRで3,7,11,12,13,15など....

set.seed(1212) 
a <- data.frame(user=rep(paste("u",1:3,sep=''),4),label=sample.int(10,12,T)) 
b <- data.frame(user=rep(paste("u",1:3,sep=''),4),label=sample.int(10,12,T)) 

merge(a,b,by='user') 

    user label.x label.y 
1 u1  3  1 
2 u1  3  3 
3 u1  3  10 
4 u1  3  5 
5 u1  3  1 
6 u1  3  3 
7 u1  3  10 
8 u1  3  5 
9 u1  1  1 
10 u1  1  3 
11 u1  1  10 
12 u1  1  5 
13 u1  4  1 
14 u1  4  3 
15 u1  4  10 
16 u1  4  5 
17 u2  7  1 
18 u2  7  7 
19 u2  7  4 
20 u2  7  2 
21 u2  2  1 
22 u2  2  7 
23 u2  2  4 
24 u2  2  2 
25 u2  6  1 
26 u2  6  7 
27 u2  6  4 
28 u2  6  2 
29 u2  1  1 
30 u2  1  7 
31 u2  1  4 
32 u2  1  2 
33 u3  8  7 
34 u3  8  1 
35 u3  8  7 
36 u3  8  4 
37 u3  1  7 
38 u3  1  1 
39 u3  1  7 
40 u3  1  4 
41 u3  10  7 
42 u3  10  1 
43 u3  10  7 
44 u3  10  4 
45 u3  9  7 
46 u3  9  1 
47 u3  9  7 
48 u3  9  4 

答えて

2

、私がしようとします:

subset(merge(a, b, by = 'user'), label.x - label.y <= 2) 

データが巨大であれば、我々は非エクイを試すことができますが、data.tableからの参加:

ここ
library(data.table) 
setDT(a) 
setDT(b) 

a[, label.a := label - 2] 
b[, label.b := label] 
y <- a[b, on = .(user, label.a <= label.b), allow.cartesian=TRUE][, label.a := NULL] 
> head(y) 
    user label i.label 
1: u1  1  1 
2: u1  3  1 
3: u1  3  1 
4: u2  1  7 
5: u2  2  7 
6: u2  6  7 

ylabelaからlabelあり、そしてlabel.ilabelですbから。

library(data.table) 
setDT(a) 
setDT(b) 

a[, label2 := label - 2] 
y <- a[ 
    b, 
    .(user, label.a = label, label.b = i.label), 
    on = .(user, label2 <= label), 
    allow.cartesian=TRUE] 
+0

これはもちろん、動作しますが、参加あまりにも高価になった後、私は、それ自体がsince.actualデータが巨大で、又貸しでマージを調整する方法を探しています:

以上の明示的、J式を使用.... –

+0

@ZahiroMor、 'data.table'を試してください(私の編集した答えを見てください)。 – mt1022

関連する問題