Перекрестное объединение в Data.table, похоже, не сохраняет имена столбцов - PullRequest
4 голосов
/ 23 марта 2019

data.table документация говорит об этом, см. ?CJ:

х = с (1,1,2)

y = c (4,6,4)

CJ (x, y) # выходные столбцы автоматически получают имена 'x' и 'y'

Однако, когда я запускаю пример, он, похоже, не сохраняется

x = c(1,1,2)
y = c(4,6,4)
CJ(x, y)
   V1 V2
1:  1  4
2:  1  4
3:  1  4
4:  1  4
5:  1  6
6:  1  6
7:  2  4
8:  2  4
9:  2  6

1 Ответ

2 голосов
/ 23 марта 2019

То, что имена сохраняются, не упоминается в основном тексте справочного файла ?CJ, то есть в разделе Сведения или Значение. Однако, как представляется, упоминается, что имена сохраняются в качестве комментариев в разделе примеров файла справки (и, похоже, именно здесь вы получили свой пример).

Копаться в функции CJ, которая, кажется, полностью реализована в R, рядом с концом есть блок,

if (getOption("datatable.CJ.names", FALSE))
    vnames = name_dots(...)$vnames

Запуск getOption("datatable.CJ.names", FALSE) возвращает FALSE с data.table версия 1.12.0. Когда мы устанавливаем это в TRUE с

options("datatable.CJ.names"=TRUE)

тогда код

x = c(1,1,2)
y = c(4,6,4)

CJ(x, y)

возвращает

   x y
1: 1 4
2: 1 4
3: 1 4
4: 1 4
5: 1 6
6: 1 6
7: 2 4
8: 2 4
9: 2 6

Однако вы также можете напрямую указать имена (которые не упомянуты в файле справки).

CJ(uu=x, vv=y)

, который возвращает

   uu vv
1:  1  4
2:  1  4
3:  1  4
4:  1  4
5:  1  6
6:  1  6
7:  2  4
8:  2  4
9:  2  6

Обратите внимание, что это отменяет вышеуказанную опцию.

...