Sto usando data.table
(1.8.9) e l'operatore :=
per aggiornare i valori in una tabella dai valori in un altro. La tabella da aggiornare (dt1) ha molte colonne fattoriali e la tabella con gli aggiornamenti (dt2) ha colonne simili con valori che potrebbero non esistere nell'altra tabella. Se le colonne in dt2 sono caratteri, ricevo un messaggio di errore, ma quando li ridimensiono ottengo dei valori errati.data.table assegnazione che coinvolge fattori
Come aggiornare una tabella senza convertire prima tutti i fattori in caratteri?
Ecco un esempio semplificato:
library(data.table)
set.seed(3957)
## Create some sample data
## Note column y is a factor
dt1<-data.table(x=1:10,y=factor(sample(letters,10)))
dt1
## x y
## 1: 1 m
## 2: 2 z
## 3: 3 t
## 4: 4 b
## 5: 5 l
## 6: 6 a
## 7: 7 s
## 8: 8 y
## 9: 9 q
## 10: 10 i
setkey(dt1,x)
set.seed(9068)
## Create a second table that will be used to update the first one.
## Note column y is not a factor
dt2<-data.table(x=sample(1:10,5),y=sample(letters,5))
dt2
## x y
## 1: 2 q
## 2: 7 k
## 3: 3 u
## 4: 6 n
## 5: 8 t
## Join the first and second tables on x and attempt to update column y
## where there is a match
dt1[dt2,y:=i.y]
## Error in `[.data.table`(dt1, dt2, `:=`(y, i.y)) :
## Type of RHS ('character') must match LHS ('integer'). To check and
## coerce would impact performance too much for the fastest cases. Either
## change the type of the target column, or coerce the RHS of := yourself
## (e.g. by using 1L instead of 1)
## Create a third table that is the same as the second, except y
## is also a factor
dt3<-copy(dt2)[,y:=factor(y)]
## Join the first and third tables on x and attempt to update column y
## where there is a match
dt1[dt3,y:=i.y]
dt1
## x y
## 1: 1 m
## 2: 2 i
## 3: 3 m
## 4: 4 b
## 5: 5 l
## 6: 6 b
## 7: 7 a
## 8: 8 l
## 9: 9 q
## 10: 10 i
## No error message this time, but it is using the levels and not the labels
## from dt3. For example, row 2 should be q but it is i.
Page 3 del data.table help file dice:
Quando LHS è una colonna fattore e RHS è un vettore personaggio con elementi mancanti dai livelli di fattore , i nuovi livelli sono automaticamente aggiunti (per riferimento, ef fi cientemente), a differenza dei metodi di base.
Questo fa sembrare che quello che ho provato dovrebbe funzionare, ma ovviamente mi manca qualcosa. Mi chiedo se questo è legato a questo problema simile:
rbindlist two data.tables where one has factor and other has character type for a column
Sembra impossibile in questo momento. – kohske