эффективное условное перекрестное соединение в таблице данных - PullRequest
1 голос
/ 12 марта 2019

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

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

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

...