4

我有一个data.table DT,我想在model.matrix上面运行。每行都有一个字符串 ID,存储在 的ID列中DT。当我运行model.matrixDT,我的公式不包括该ID列。问题是,model.matrix由于 NA 删除了一些行。如果我在调用之前将行名设置DT为列,那么最终的模型矩阵具有行名,我就准备好了。否则,我无法弄清楚我最终得到了哪些行。我正在使用. 但是,当我尝试向 中添加新列时,我收到了关于IDmodel.matrixrownames(DT) = DT$IDDT

“检测到无效的 .internal.selfref ......在早些时候,这个 data.table 已被 R 复制。”

所以我想知道

  1. 有没有更好的方法来设置行名data.table
  2. 有没有更好的方法来解决这个问题。
4

1 回答 1

10

这里有几个问题。

首先,a 的一个特性是data.table它们没有 a rownames,而是具有key更强大的 s。看到这个伟大的小插曲

但是,这不是世界末日。model.matrix传递时返回合理的行名data.table

例如

A <- data.table(ID = 1:5, x = c(NA, 1:4), y = c(4:2,NA,3))

mm <- model.matrix( ~ x + y, A)

rownames(mm)

## [1] "2" "3" "5"

所以第 2,3 和 5 行是包含在 model.matrix 中的那些。

现在,您可以将此序列作为列添加到A. 如果您随后将密钥设置为其他内容(从而丢失原始顺序),这将很有用

A[, rowid := seq_len(nrow(A)]

您可能会考虑将其设为字符(如 ) 的行名mm),但这并不重要(因为您可以 rownames(mm)在需要引用时轻松转换为数字。

至于给出的警告data.table,如果您阅读下一句

避免 key<-、names<- 和 attr<- 目前在 R 中(奇怪的是)可能会复制整个 data.table。使用 set* 语法来避免复制:setkey()、setnames() 和 setattr()

rownames是一个属性rownames<-(在内部某个时候使用等价于attr<-)将以相同的方式(可能复制)。

从线`row.names<-.data.frame`

attr(x, "row.names") <- value

话虽data.tables如此,没有行名,所以设置它们没有意义。

于 2012-12-20T22:20:07.903 回答