【问题标题】:R: Why is a not data.table assigned data.frame automatically DT?R:为什么一个没有data.table的data.frame会自动分配DT?
【发布时间】:2015-11-18 18:37:43
【问题描述】:

我有一个data.frame,这里是一个例子:

df <- data.frame(object = c("apples","tomatoes", "apples","pears" ),
                 Value = c(50,10,30,40))

我复制了这个 df 以将其保存为 data.frame 格式:

forDT <- df

我分配给 data.table 的新复制的 data.frame 执行数据拆分:

require(data.table)
tmp = setDT(forDT)[, list(grp=list(.SD)), by=.(object), .SDcols=names(forDT)]
setattr(import_split <- tmp$grp, 'names', paste(tmp$object, sep="."))

在接下来的步骤中,我需要未转换为 data.table 的原始 data.frame 以进行进一步计算(因为我更熟悉 data.frames,这就是我一开始制作副本的原因)。但是,原来的df 也是data.table 格式的。我做错了什么?想法?谢谢

【问题讨论】:

  • 使用as.data.table 而不是setDT。使用 setDT 不会创建副本。
  • forDT &lt;- df 不会创建副本。使用 data.table 包中的copy()。或者使用 Ananda Mahto 提到的 as.data.table()。还可以查看Reference Semantics 小插图。
  • data.table 不还是 data.frame 吗?为什么要制作副本以保留它?

标签: r dataframe data.table


【解决方案1】:

“data.table”中的set* 函数不会复制您的数据。

要进行复制,您应该使用as.data.table 或使用“data.table”包中的copy 函数。

【讨论】:

  • 我想这不仅仅是set* 没有制作副本(OP 可能已经知道/期望),而且forDT &lt;- df 没有制作副本。因为data.frame只是一个指向列列表的指针,forDT和df指向同一个东西,被set*修改。
猜你喜欢
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 2017-02-13
  • 1970-01-01
相关资源
最近更新 更多