使用spread()时会复制data.table吗?

时间:2017-10-26 15:58:35

标签: r data.table tidyr

以下是data.table示例。

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))

我使用tydir::spread从长格式转到宽格式

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

然后我想在

中定义新列
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()解决此问题?

1 个答案:

答案 0 :(得分:0)

我认为使用private void CopyScreen() { var picBox = pictureBox; var bit = new Bitmap(this.Width, this.Height); using (var g = Graphics.FromImage(bit)) { var upperLeftSource = new Point( Screen.PrimaryScreen.Bounds.Width / 2 - this.Width / 2, Screen.PrimaryScreen.Bounds.Height / 2 - this.Height / 2); g.CopyFromScreen(upperLeftSource, new Point(0, 0), bit.Size); var oldImage = picBox.Image; picBox.Image = bit; oldImage?.Dispose(); } } 是可行的方法。但是,使用dcast的可能解决方案是将tidyr::spread添加到管道呼叫,即

setDT()