2017-10-26 8 views
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()使っていますか?

+0

タイトルは非常に有益ではないかもしれない、パイプで連結されたコールにsetDT()を追加することです。もしそれが更新されたら、 – simone

+5

'tidyr :: spread'が内部構造を壊してしまい、' data.table'が修正されます(警告)。 'copy'の間に作成された新しい' data.table'は自動的に正しい内部構造を持っています。ここでの内部構造とは、列iircのために予め割り当てられたメモリを指す。 – eddi

+0

私はこの行動に驚いた。私は 'gather()'が 'data.table'を返すとは思わない。警告を避けるために 'copy()'を使うべきでしょうか? – simone

答えて

0

私はdcastを使用して行くと思います。しかし、tidyr::spreadを使用して可能な解決策は、すなわち、

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] 
関連する問題