data.table 在使用 spread() 时被复制了?
data.table is copied when using spread()?
这是一个示例 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()
是解决这个问题的正确方法吗?
我认为使用 dcast
是可行的方法。但是,使用 tidyr::spread
的可能解决方案是将 setDT()
添加到管道调用中,即
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]
这是一个示例 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()
是解决这个问题的正确方法吗?
我认为使用 dcast
是可行的方法。但是,使用 tidyr::spread
的可能解决方案是将 setDT()
添加到管道调用中,即
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]