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?
Titel vielleicht nicht sehr informativ. Bitte updaten wenn ja – simone
'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
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