我在R中分配data.table列时遇到问题。我的示例代码如下:
library(data.table)
DT <- data.table(A=c(3,5,2,6,4), B=c(6,2,7,2,1), Amount=1:5)
setkey(DT, A)
amt <- DT$Amount
amt #3 1 5 2 4
setkey(DT, B)
amt #5 2 4 1 3
我使用“$”符号将data.table的列分配给变量“amt”,但看起来在我更改了data.table的顺序后,“amt”的顺序也发生了变化。谁能告诉我为什么会这样?我怎样才能避免这种情况发生(当我改变DT的顺序时,我不希望改变“amt”的顺序)?
非常感谢你。
答案 0 :(得分:6)
要解决此问题,您可以获取该列的副本:
amt <- copy(DT$Amount)
分配amt <- DT$Amount
时,结果是“浅拷贝”,它只是指向原始列的指针。如果您需要to create a copy of a data.table,则会出现同样的问题,其中最佳做法是DT2 <- copy(DT)
。
请注意,data.tables - 就像data.frames一样,它们是一个特例 - 每个都是指向列的指针的向量;并且此复制行为是从基础R继承的。例如:
DF <- data.frame(x=c(1,4,2)); xx <- DF$x; setorder(DF,x); identical(xx,DF$x) # TRUE
强烈建议The link above提供有关最佳做法的技术细节和建议。