2014-10-29 3 views
1

У меня есть таблица данных с неоднородными ключами:Регистрация с неоднородными ключами, уникальными в я

> dput(sv) 
structure(list(kwd = c("a", "a", "b", "b", "c"), pixel = c(1, 
2, 1, 2, 2), kpN = c(2L, 2L, 2L, 1L, 1L)), row.names = c(NA, 
-5L), class = c("data.table", "data.frame"), .Names = c("kwd", 
"pixel", "kpN"), .internal.selfref = <pointer: 0x7fc4aa800778>, sorted = "kwd") 
> dput(kwd) 
structure(list(kwd = c("a", "b", "c", "z"), kwdN = c(3L, 2L, 
1L, 1L)), row.names = c(NA, -4L), class = c("data.table", "data.frame" 
), .Names = c("kwd", "kwdN"), .internal.selfref = <pointer: 0x7fc4aa800778>, sorted = "kwd") 

почему я получаю эту ошибку:

> sv[kwd,kwdN:=kwdN] 
Starting bmerge ...done in 0 secs 
Error in vecseq(f__, len__, if (allow.cartesian || notjoin) NULL else as.integer(max(nrow(x), : 
    Join results in 6 rows; more than 5 = max(nrow(x),nrow(i)). Check for duplicate key values in i, each of which join to the same group in x over and over again. If that's ok, try including `j` and dropping `by` (by-without-by) so that j runs for each group to avoid the large allocation. If you are sure you wish to proceed, rerun with allow.cartesian=TRUE. Otherwise, please search for this error message in the FAQ, Wiki, Stack Overflow and datatable-help for advice. 
Calls: [ -> [.data.table -> vecseq 

я ожидал что-то подобное (обратите внимание, что ключи:.

kwd pixel kpN kwdN 
1: a  1 2 3 
2: a  2 2 3 
3: b  1 2 2 
4: b  2 1 2 
5: c  2 1 1 

Кроме того, я уверен, что он работал, как, что до

Это что-то, что изменилось в data.table 1.9.4?

Как мне получить то, что я хочу? (kwd[sv], кажется, работает, является то, что новый путь?)

+0

Попробуйте 'sv [kwd, kwdN: = i.kwdN]' – akrun

+0

Ошибка 'allow.cartesian' не должна появляться здесь. Это было зафиксировано в 1.9.5. Контрольная точка 8 в исправлении ошибок для 1.9.5 [здесь] (https://github.com/Rdatatable/data.table/blob/master/README.md). Если 'i' имеет дубликаты, то, как уже сказано в сообщении об ошибке, вы должны использовать' allow.cartesian = TRUE'. – Arun

+0

@Arun: У меня 1.9.4 – sds

ответ

1

Просто так это по-прежнему отвечал:

allow.cartesian функциональность была реализована после this сообщению от @Roland. Также см. Сообщение this для дополнительного пояснения.

Случаев, когда allow.cartesian не является необходимым (и, следовательно, не должна ошибкой) являются:

  • когда i не имеет дубликатов #742 - это не был проверен правильно раньше. Исправлено в 1.9.5 (текущая версия разработки).

  • Когда j имеет :=#800 - количество строк никогда не будет превышать x. Исправлено в 1.9.5 (текущая версия разработки).

  • Когда операция является не присоединиться (или против присоединиться), #698 - количество строк никогда не превысит x еще раз. Исправлено в 1.9.4.

В целом, allow.cartesian Ошибка возникает только там, где это необходимо. Исправления, сделанные в 1.9.5, станут доступными, когда 1.9.6 будет выпущен на CRAN (должно быть очень скоро).

Смежные вопросы