将列的属性保存在data.table

时间:2018-07-31 19:09:01

标签: r data.table

data.table对象的列中对某些值进行子集设置时,该列的属性将保留下来,如下例所示。

library(data.table)
set.seed(1L)
dt1 <- data.table(a=runif(5L))
setattr(dt1$a, "foo", "bar")
dt1[1:2, a:=runif(.N)]
dt1[1:2, a]
##  [1] 0.8983897 0.9446753
##  attr(,"foo")
##  [1] "bar"

但是,如果重新定义整个列,则会丢失属性。

dt1[, a:=runif(.N)]
dt1[1:2, a]
##  [1] 0.6607978 0.6291140

我猜这种现象是由于这样的事实:当对一列的某些值进行子集化时,一个人仅通过引用来更新那些元素,而当对整个列进行子集化时,一个人实际上并没有更新该列的某些元素,而是替换整列(仍通过引用)。

我知道,当人们想更改列的类而不必删除它并重新分配它时,这种行为是很好的(例如,即使dt1[, a:=as.integer(a)]先前是类{{ 1}}),但是我想知道是否有一种方法可以解决这个问题,甚至在替换所有值时也可以强制该列保留其原始属性(显然包括其类)。

谢谢!

0 个答案:

没有答案