2017-12-04 14 views
0

x $ val> = y $ start & x $ < = y $ endの2つのデータフレーム(data.tables)xとyを結合しようとしています。 dplyrを使用することはできません。dplyrの不等式結合を行う唯一の方法は、テーブルを結合して不等式をフィルタリングすることです。結合するテーブルには315kと84kのレコードがあります。それは記憶を吹き飛ばすだろう。R join with data.table

data.tableには不等号結合がありますが、私の人生にとって構文の仕組みを理解できません。この結果を参照してください:私を得ることを期待するものを表示するには

x <- data.table(val = c(1:5), id = "a") 
y <- data.table(start = c(1:5), end = c(11:15), id= "a") 

x[y, on=c("val>=start","val<=end"), 
    .(start, val, end)] 

    start val end 
1:  1 1 11 
2:  1 1 11 
3:  1 1 11 
4:  1 1 11 
5:  1 1 11 
6:  2 2 12 
7:  2 2 12 
8:  2 2 12 
9:  2 2 12 
10:  3 3 13 
11:  3 3 13 
12:  3 3 13 
13:  4 4 14 
14:  4 4 14 
15:  5 5 15 

を、ここでdplyrが生成するものです:

x <- data.table(val = c(1:5), id = "a") 
y <- data.table(start = c(1:5), end = c(11:15), id= "a") 

x %>% 
    inner_join(y) %>% 
    filter(val >= start & val <= end) 

    val id start end 
1 1 a  1 11 
2 2 a  1 11 
3 2 a  2 12 
4 3 a  1 11 
5 3 a  2 12 
6 3 a  3 13 
7 4 a  1 11 
8 4 a  2 12 
9 4 a  3 13 
10 4 a  4 14 
11 5 a  1 11 
12 5 a  2 12 
13 5 a  3 13 
14 5 a  4 14 
15 5 a  5 15 

誰もが、それは私がdata.table構文で欠けているされたかを説明することはできますか?あなたは接頭辞(x.)で左の表からval列を選択する必要が

答えて

0

。詳細についてはthis answer

x[y, on=.(val >= start, val <= end), .(val = x.val, id, start, end)][order(val)] 
#           ^^ 
# val id start end 
#1: 1 a  1 11 
#2: 2 a  1 11 
#3: 2 a  2 12 
#4: 3 a  1 11 
#5: 3 a  2 12 
#6: 3 a  3 13 
#7: 4 a  1 11 
#8: 4 a  2 12 
#9: 4 a  3 13 
#10: 4 a  4 14 
#11: 5 a  1 11 
#12: 5 a  2 12 
#13: 5 a  3 13 
#14: 5 a  4 14 
#15: 5 a  5 15 
+0

を参照してください。わかりましたが、それは本当に混乱しています。ありがとうございました。 – Tom

+0

うん、それは動作が混乱している、うまくいきなり間に合うだろう。 – Psidom