эффективное условное перекрестное соединение в таблице данных

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

Причина, по которой я хочу обусловить ПЕРЕД перекрестным соединением, заключается в том, что фактические данные, которые у меня есть, огромны, и поэтому неэффективно сначала генерировать все это, а ЗАТЕМ обрезать его.

Причина, по которой я не могу просто выполнить слияние, заключается в том, что мне нужно также перекрестно соединить другие строки.


person wolfsatthedoor    schedule 11.03.2019    source источник
comment
У меня были похожие проблемы с data.table, и было бы очень полезно узнать ответ на этот вопрос.   -  person svenkatesh    schedule 12.03.2019
comment
Внутреннее соединение — это просто перекрестное соединение с последующим выбором по условию. Просто напишите внутреннее соединение, соответствующее желаемому условию. (Перекрестное соединение — это внутреннее соединение, для которого установлено значение true.)   -  person philipxy    schedule 12.03.2019
comment
например x[, k:=t+1][x2[, k:=tprime], on=.(k), nomatch=0L][, .(t, tprime, z, zprime)]   -  person chinsoon12    schedule 12.03.2019
comment
1.6 Каковы преимущества возможности использовать имена столбцов, как если бы они были переменными внутри DT[. ..]? внутри квадратных скобок data.table видит этот запрос целиком, прежде чем какая-либо его часть будет оценена. Таким образом, он может оптимизировать комбинированный запрос для повышения производительности. Он может сделать это, потому что язык R имеет уникальные ленивые вычисления.   -  person philipxy    schedule 12.03.2019
comment
@chinsoon12 chinsoon12, я думаю, для этого вам нужно allowcartesian =T. Кроме того, как насчет этого у вас есть несколько условий? В частности, предположим, что у вас есть условие t, а также условие, которое говорит, что zprime должно быть некоторой функцией z (например, оно должно быть меньше квадрата)   -  person wolfsatthedoor    schedule 12.03.2019
comment
вы можете добавить allowcartesian=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.2019
comment
@chinsoon12, интересно. Предположим, у вас есть y1‹y2, y3‹y4 и т. д. для произвольного числа y. Как бы вы выразили это динамически в этом смысле? что-то с редукцией?   -  person wolfsatthedoor    schedule 12.03.2019
comment
on также работает со строкой символов. просто не оставляйте места, например. on=c("y1<y2", "y3<y4"). вы можете увидеть справку в ?data.table   -  person chinsoon12    schedule 12.03.2019
comment
@ chinsoon12, если вы опубликуете комментарий в качестве ответа, я буду рад наградить вас за лучший ответ. Кроме того, я задал здесь внутреннее соединение с несколькими условиями: несколько условий r таблица данных"> stackoverflow.com/questions/55132230/   -  person wolfsatthedoor    schedule 13.03.2019