0
サンプルはdata.table
です。私はspread()を使用するとdata.tableがコピーされますか?
mydt2 <- mydt %>% spread(group, prob)
ワイドフォーマットに長いから行くためにtydir::spread
を使用
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))
それから私は私がこれを行う場合、私は次の警告を得る
mydt2[!is.na(group1), new.col := x]
のように新しい列を定義したいです
Warning message:
In `[.data.table`(mydt2, !is.na(group1), `:=`(myscale, x)) :
Invalid .internal.selfref detected and fixed by taking a (shallow) copy
この代わりにこれを実行すると、
mydt2 <- copy(mydt %>% spread(group, prob))
mydt2[!is.na(group1), myscale := x]
私は警告を受けません。私はこの行動を理解していません。誰も助けを提供できますか?これに対処する正しい方法をcopy()
使っていますか?
タイトルは非常に有益ではないかもしれない、パイプで連結されたコールに
setDT()
を追加することです。もしそれが更新されたら、 – simone'tidyr :: spread'が内部構造を壊してしまい、' data.table'が修正されます(警告)。 'copy'の間に作成された新しい' data.table'は自動的に正しい内部構造を持っています。ここでの内部構造とは、列iircのために予め割り当てられたメモリを指す。 – eddi
私はこの行動に驚いた。私は 'gather()'が 'data.table'を返すとは思わない。警告を避けるために 'copy()'を使うべきでしょうか? – simone