2015-04-15 3 views
6

Sto cercando di fare: = per gruppo per una colonna esistente di tipo 'intero' dove i nuovi valori sono di tipo 'double', che fallisce.Come modificare il tipo di colonna di destinazione quando si esegue: = per gruppo in un data.table in R?

Il mio scenario sta mutando una colonna che rappresenta il tempo in un POSIXct in base ai valori in altre colonne. Potrei modificare la creazione di data.table come un aggiramento, ma sono ancora interessato a come procedere cambiando effettivamente il tipo di una colonna, come suggerito nel messaggio di errore.

Ecco un semplice esempio giocattolo del mio problema:

db = data.table(id=rep(1:2, each=5), x=1:10, y=runif(10)) 
db 
id x   y 
1: 1 1 0.47154470 
2: 1 2 0.03325867 
3: 1 3 0.56784494 
4: 1 4 0.47936031 
5: 1 5 0.96318208 
6: 2 6 0.83257416 
7: 2 7 0.10659533 
8: 2 8 0.23103810 
9: 2 9 0.02900567 
10: 2 10 0.38346531 

db[, x:=mean(y), by=id] 

Error in `[.data.table`(db, , `:=`(x, mean(y)), by = id) : 
Type of RHS ('double') 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) 

risposta

10

Siamo in grado di convertire la classe di colonna 'x' a 'numerica' prima di assegnare il 'media (y)' a 'x' come la classe di 'x' è 'intero'. Questo può essere utile se sostituiamo 'x' con lo mean di qualsiasi altra variabile numerica (inclusa 'x').

db[, x:= as.numeric(x)][, x:= mean(y), by=id][] 

o assegnare ad una nuova colonna, e cambiare il nome della colonna in seguito

setnames(db[, x1:= mean(y),by=id][,x:=NULL],'x1', 'x') 

Oppure possiamo assegnare 'x' a 'NULL' e quindi creare 'x' come mean di 'y '(@David Arenburg's suggerimento)

db[, x:=NULL][, x:= mean(y), by= id][] 
+1

Amore la risposta veloce! Completamente dimenticato di cambiare ... per quanto riguarda il secondo suggerimento, usare 'x1' nei setnames sarebbe forse ancora più ordinato? Cioè setnames (db [, x1: = mean (y), per = id] [, x: = NULL], 'x1', 'x') – hallvig

+0

Haha lo farò - devo solo aspettare qualche altro minuto ;-) – hallvig

+0

@hallvig Grazie – akrun