2017-10-26 4 views
0

Hier ist ein Beispiel data.table.data.table wird kopiert, wenn spread() verwendet wird?

set.seed(123) 
mydt <- data.table(id = 1:100, x = sample(LETTERS[1:6], size = 100, replace = TRUE), group = paste0("group", sample(1:3, size = 100, replace = TRUE)), prob = runif(100, 0, 1)) 

Ich benutze tydir::spread von lang auf Großformat zu gehen

mydt2 <- mydt %>% spread(group, prob) 

Dann habe ich als neue Spalten definieren wollen in

mydt2[!is.na(group1), new.col := x] 

Wenn ich das tue, erhalte ich die folgende Warnung

Warning message: 
In `[.data.table`(mydt2, !is.na(group1), `:=`(myscale, x)) : 
Invalid .internal.selfref detected and fixed by taking a (shallow) copy 

etc, während, wenn ich dies anstelle

Ich bekomme keine Warnung. Ich verstehe dieses Verhalten nicht. Kann jemand Hilfe anbieten? Verwenden Sie copy() den richtigen Weg, um dies zu beheben?

+0

Titel vielleicht nicht sehr informativ. Bitte updaten wenn ja – simone

+5

'tidyr :: spread' verschraubt die interne Struktur, die dann' data.table' behebt (also die Warnung); während die neue 'data.table', die während' copy' erstellt wird, automatisch die korrekte interne Struktur hat. Die interne Struktur bezieht sich hier auf zuvor zugewiesenen Speicher für Spalten. – eddi

+0

Ich war von diesem Verhalten überrascht. Ich glaube nicht, dass 'gather()' zum Beispiel eine 'data.table' zurückgibt. Sollte ich 'copy()' verwenden, um eine Warnung zu vermeiden? – simone

Antwort

0

Ich denke, mit dcast ist der Weg zu gehen. Jedoch eine mögliche Lösung tidyr::spread Verwendung wäre setDT() zum verrohrt Anruf hinzuzufügen, das heißt

set.seed(123) 

# install.packages(c("data.table"), dependencies = TRUE) 
library(data.table) 

mydt <- data.table(id = 1:100, x = sample(LETTERS[1:6], size = 100, replace = TRUE), 
        group = paste0("group", sample(1:3, size = 100, replace = TRUE)), 
        prob = runif(100, 0, 1) 
        ) 

class(mydt) 
mydt2 <- mydt %>% tidyr::spread(group, prob) %>% setDT() 

mydt2[!is.na(group1), new.col := x] 
Verwandte Themen