R中的model.matrix的data.table的Rownames

时间:2012-12-20 17:51:51

标签: r data.table model.matrix

我有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复制。“

所以我想知道

  1. 是否有更好的方法为DT
  2. 设置rownames
  3. 有没有更好的方法来解决这个问题。

1 个答案:

答案 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,所以没有必要设置它们。