【问题标题】:Assign a data.table column to a variable in R将 data.table 列分配给 R 中的变量
【发布时间】:2015-09-03 01:30:34
【问题描述】:

我对 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”的顺序)?

非常感谢。

【问题讨论】:

  • 我的猜测:DT$Amount 是指向数据表列的指针,而不是向量的副本。如果您想要一份副本,您可以使用该功能amt &lt;- copy(DT$Amount)。如果您尝试使用 DT2 &lt;- DT 复制 DT,您会遇到同样的问题——同样,copy() 就是答案。
  • @Frank 回答,为什么要在 data.table 标签上保留未解决的问题?
  • @jangorecki 好的,完成。我希望你们知道技术细节的人会根据需要编辑答案。我认为链接的问题涵盖了所有内容,因此最好将其两个答案保持最新(最后一次编辑于 2013 年 1 月)。
  • 请看一下 Reference Semantics vignette here.

标签: r data.table variable-assignment


【解决方案1】:

要解决这个问题,您可以复制该列:

amt <- copy(DT$Amount)

当分配amt &lt;- DT$Amount 时,结果是一个“浅拷贝”,它只是一个指向原始列的指针。当您想要to create a copy of a data.table 时,也会出现同样的问题,最佳实践是DT2 &lt;- 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 提供技术细节和最佳实践建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    相关资源
    最近更新 更多