首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在使用data.table ()时会复制吗?

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

Stack Overflow用户
提问于 2017-10-26 15:58:34
回答 1查看 90关注 0票数 0

这是一个示例data.table

代码语言:javascript
运行
复制
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从长格式到宽格式

代码语言:javascript
运行
复制
mydt2 <- mydt %>% spread(group, prob)

然后,我想定义新列,如

代码语言:javascript
运行
复制
mydt2[!is.na(group1), new.col := x]

如果我这样做,我会收到以下警告

代码语言:javascript
运行
复制
Warning message:
In `[.data.table`(mydt2, !is.na(group1), `:=`(myscale, x)) :
 Invalid .internal.selfref detected and fixed by taking a (shallow) copy

等等,如果我用这个代替

代码语言:javascript
运行
复制
mydt2 <- copy(mydt %>% spread(group, prob))
mydt2[!is.na(group1), myscale := x]

我没有收到任何警告。我不明白这种行为。有人能提供帮助吗?使用copy()是解决这个问题的正确方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-27 11:38:33

我认为使用dcast是可行的。但是,使用tidyr::spread的一个可能的解决方案是将setDT()添加到管道调用中,即,

代码语言:javascript
运行
复制
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]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46958830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档