2015-04-15 6 views
6

Próbuję zrobić: = przez grupę dla istniejącej kolumny typu "integer", gdzie nowe wartości są typu "double", co nie powiedzie się.Jak zmienić typ kolumny docelowej podczas wykonywania: = według grupy w tabeli data.table w R?

Mój scenariusz polega na mutowaniu kolumny przedstawiającej czas na POSIXct na podstawie wartości w innych kolumnach. Mógłbym zmodyfikować tworzenie pliku data.table jako obejście, ale nadal interesuje mnie, jak właściwie zmienić typ kolumny, jak sugeruje komunikat o błędzie.

Oto prosty przykład zabawka mojego problemu:

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) 

Odpowiedz

10

Możemy przekształcić klasę „x” kolumnie „numeryczny” przed przypisaniem „oznaczają (Y)” do „x” jako klasa "x" to "liczba całkowita". Może to być przydatne, jeśli zastępujemy "x" wartością mean dowolnej innej zmiennej numerycznej (w tym "x").

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

lub przypisać do nowej kolumny i zmienić nazwę kolumny potem

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

Albo możemy przypisać „x” na „null”, a następnie utworzyć „x” jako mean z „Y '(Sugestia Davida Arenburga)

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

Uwielbiam szybką reakcję! Całkowicie zapomniałeś o zmianie ... odnośnie drugiej sugestii, użycie "x1" w nazwach byłoby być może nawet starsze? To znaczy. setnames (db [, x1: = mean (y), by = id] [, x: = NULL], 'x1', 'x') – hallvig

+0

Haha Będę - wystarczy poczekać kilka minut ;-) – hallvig

+0

@hallvig Dzięki – akrun