我有data.table
DT
,我想在其上运行model.matrix
。每行都有一个字符串ID,该ID存储在ID
的{{1}}列中。当我在DT
上运行model.matrix
时,我的公式会排除DT
列。问题是,由于NAs,ID
会丢弃一些行。如果我在调用model.matrix
之前将DT
的rownames设置为ID
列,那么最终的模型矩阵会有rownames,而且我已全部设置完毕。否则,我无法弄清楚我最终会遇到什么行。我用model.matrix
设置了rownames。但是,当我尝试向rownames(DT) = DT$ID
添加新列时,我会收到有关
“无效的.internal.selfref被检测到......在早些时候,这个 data.table已由R复制。“
所以我想知道
DT
答案 0 :(得分:10)
这里有几个问题。
首先,data.table
的一个特征是它们没有rownames
,而是key
更强大的model.matrix
。请参阅this great vignette。
但是,它不是世界末日。当您将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"
时,A
会返回合理的rownames
例如
A[, rowid := seq_len(nrow(A)]
因此,第2,3和5行包含在model.matrix中。
现在,您可以将此序列作为列添加到mm
。如果您将密钥设置为其他内容(从而丢失原始顺序),这将非常有用
rownames(mm)
您可以考虑将其设置为字符(如data.table
的rownames),但这并不重要(因为您可以在需要引用时轻松将rownames
转换为数字。 / p>
关于rownames<-
给出的警告,如果您阅读下一句话
避免使用键&lt; - ,名称&lt; - 和attr&lt; - 当前(并且奇怪地)在R中可以复制整个data.table。使用set *语法来避免复制:setkey(),setnames()和setattr()
attr<-
是一个属性`row.names<-.data.frame`
(在某个点内部使用相当于attr(x, "row.names") <- value
)将以相同的方式(可能复制)。
来自data.tables
的行是
{{1}}
话虽如此,{{1}}没有rownames,所以没有必要设置它们。