EDITED (Извините, я изменил код, в нем была ошибка, препятствовавшая воспроизведению.)
Я пытаюсь эффективно объединиться с условием.
То, как я делаю это сейчас, заключается в перекрестном объединении (которое я хочу сохранить), за исключением того, что у меня есть одно условие для подмножества столбцов.
Функция перекрестного соединения (от здесь)
CJ.table.1 <- function(X,Y)
setkey(X[,c(k=1,.SD)],k)[Y[,c(k=1,.SD)],allow.cartesian=TRUE][,k:=NULL]
set.seed(1)
#generate data
x = data.table(t=rep(1:10,2), z=sample(1:10,20,replace=T))
x2 = data.table(tprime=rep(1:10,2), zprime=sample(1:10,20,replace=T))
joined = CJ.table.1(x,x2)
> joined
t z tprime zprime
1: 1 3 1 10
2: 2 4 1 10
3: 3 6 1 10
4: 4 10 1 10
5: 5 3 1 10
---
396: 6 5 10 5
397: 7 8 10 5
398: 8 10 10 5
399: 9 4 10 5
400: 10 8 10 5
Затем я хочу убедиться, что t
увеличивается только на 1.
setcolorder(joined, c("t", "tprime", "z",'zprime'))
joined=joined[tprime==t+1]
Тогда окончательный желаемый результат:
> joined
t tprime z zprime
1: 1 2 3 3
2: 1 2 3 3
3: 2 3 4 7
4: 2 3 2 7
5: 3 4 6 2
6: 3 4 7 2
7: 4 5 10 3
8: 4 5 4 3
9: 5 6 3 4
10: 5 6 8 4
11: 6 7 9 1
12: 6 7 5 1
13: 7 8 10 4
14: 7 8 8 4
15: 8 9 7 9
16: 8 9 10 9
17: 9 10 7 4
18: 9 10 4 4
19: 1 2 3 6
20: 1 2 3 6
21: 2 3 4 5
22: 2 3 2 5
23: 3 4 6 2
24: 3 4 7 2
25: 4 5 10 9
26: 4 5 4 9
27: 5 6 3 7
28: 5 6 8 7
29: 6 7 9 8
30: 6 7 5 8
31: 7 8 10 2
32: 7 8 8 2
33: 8 9 7 8
34: 8 9 10 8
35: 9 10 7 5
36: 9 10 4 5
t tprime z zprime
Причина, по которой я хочу обусловить ПЕРЕД перекрестным соединением, заключается в том, что фактические данные, которые у меня есть, огромны, и поэтому неэффективно сначала генерировать все это, а ЗАТЕМ обрезать его.
Причина, по которой я не могу просто выполнить слияние, заключается в том, что мне нужно также перекрестно соединить другие строки.
x[, k:=t+1][x2[, k:=tprime], on=.(k), nomatch=0L][, .(t, tprime, z, zprime)]
- person chinsoon12   schedule 12.03.2019allowcartesian=TRUE
всякий раз, когда вы получаете это сообщение об ошибке. чтобы добавить больше условий, используйте что-то вродеx[, c('k', 'y1') := .(t+1, z)][x2[, c('k','y2') := .(tprime, myfun(zprime)], on=.(k=k, y1<y2)][, .(t, tprime, z, zprime)]
- person chinsoon12   schedule 12.03.2019on=c("y1<y2", "y3<y4")
. вы можете увидеть справку в?data.table
- person chinsoon12   schedule 12.03.2019