R 中 data.table 的 colnames() 行为

Posted

技术标签:

【中文标题】R 中 data.table 的 colnames() 行为【英文标题】:colnames() behaviour with data.table in R 【发布时间】:2019-06-19 09:16:03 【问题描述】:

将 colnames() 函数与 data.table 一起使用似乎会将结果变量转换为“通过引用传递”的变量。我正在使用 R 3.6.0 和 data.table 1.12.2

library(data.table)
DT = data.table(
  ID = c("b","b","b","a","a","c"),
  a = 1:6,
  b = 7:12,
  c = 13:18
)

column_names = colnames(DT)
DT[, e := 23:28]
column_names 

我希望 column_names 是“ID”“a”“b”和“c”,不包括新添加的“e”列。但是 column_names 已更新。这种行为正常吗?

【问题讨论】:

Why does data.table update names(DT) by reference, even if I assign to another variable?的可能重复 是的,这是正确的行为。 【参考方案1】:

我们需要使用copy来避免它在分配后根据?copy的文档被更改

执行 dt_names = names(DT) 时可能需要一个 copy()。由于 R 的修改时复制,dt_names 仍然指向与名称(DT)相同的内存位置。因此,现在通过引用修改 DT,比如添加一个新列,dt_names 也将得到更新。为避免这种情况,必须明确复制: dt_names

所以,我们做到了

column_names = copy(colnames(DT))

现在,在分配之后

DT[, e := 23:28]
column_names 
#[1] "ID" "a"  "b"  "c" 

【讨论】:

以上是关于R 中 data.table 的 colnames() 行为的主要内容,如果未能解决你的问题,请参考以下文章

R语言data.table导入数据实战:data.table中编写函数并使用SD数据对象

如何计算 R 中 data.table 中的出现组合

了解 R 中 data.table 的引用属性

R:嵌套 data.table 到 JSON

R在for循环中从data.table中提取元素[重复]

R之data.table速查手册