2016-01-25 4 views
8

Ecco un esempio riproducibile:Problemi con chiave secondaria di data.table

myDT <- data.table(ID=c('A','B','B'), val=c('check','check','a')); 
myDT[val == "check"]; # <= secondary index created on calling this 
myDT[, val:=ifelse(.N>1, '2', '1'), by=ID] 

myDT 
# ID val 
# 1: A 1 
# 2: B 2 
# 3: B 2 

key(myDT) 
# NULL 
key2(myDT) 
# [1] "val" 

Ora, io chiamo un semplice comando che dà un po 'strano (per me) Risultato:

myDT[val=='2', res:='yes'][]; 
# ID val res 
# 1: A 1 NA 
# 2: B 2 yes 
# 3: B 2 NA 

Con filtro val=='2', mi aspettavo di ottenere i record 2 e 3, ma in realtà ho ottenuto solo il record 3. Ciò è ovviamente dovuto alla chiave secondaria perché la sua rimozione riporta il comportamento previsto:

set2key(myDT, NULL) 
myDT[val=='2', res:='yes'][]; 
# ID val res 
# 1: A 1 NA 
# 2: B 2 yes 
# 3: B 2 yes 

Mi chiedo se si tratta di un bug o comportamento previsto. Nel mio caso, ovviamente non era desiderato: non sapevo nemmeno di cosa fosse la chiave secondaria (prima di chiedere that SO question), e ho passato molto tempo a cercare di capire perché mi mancano alcuni record. Per me, ho risolto il problema aggiungendo l'istruzione set2key(myDT, NULL) ma ora mi preoccupo che cose simili possano accadere in alcune parti del mio codice e non so come rilevarlo/impedirlo - Non vorrei aggiungere chiamate set2key(., NULL) dopo ogni altra linea ...

+1

Sembra un tipo di errore. Sembra che sia stato causato cambiando i valori della colonna su cui è impostata la chiave secondaria senza aggiornare la chiave secondaria stessa. ma di solito sono sbagliato riguardo a queste cose. Vale la pena postare un [problema su GH] (https://github.com/Rdatatable/data.table/issues/new) –

+0

grazie per il supporto, lo posterò allora. Mi chiedo se il mio codice possa essere ulteriormente semplificato per fare un esempio minimo. –

+0

Sì, puoi fare qualcosa come 'myDT <- data.table (ID = c ('A', 'B', 'B'), val = c ('check', 'check', 'a')) ; myDT [val == "check"]; myDT [, val: = ifelse (.N> 1, '2', '1'), da = ID]; myDT [val == '2'] '. Sembra che ci sia qualcosa in relazione con la modifica dei valori nella chiave mentre lo facciamo per gruppo combinato con 'ifelse'. Hai trovato uno scenario molto specifico a cui non hanno pensato sembra. –

risposta

0

questo era davvero un bug (l'ho segnalato ma è risultato essere segnalato già), ed è stato corretto nella versione 1.9.7 del pacchetto - ora tutto funziona!