【问题标题】:Rownames for data.table in R for model.matrixR中用于model.matrix的data.table的行名
【发布时间】:2012-12-08 07:15:07
【问题描述】:

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

的投诉

“检测到无效的 .internal.selfref ...... data.table 已被 R 复制。”

所以我想知道

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

【问题讨论】:

    标签: r data.table model.matrix


    【解决方案1】:

    这里有几个问题。

    首先,data.table 的一个功能是它们没有rownames,而是拥有更强大的keys。见this great vignette

    但是,这不是世界末日。 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

    rownames 是一个属性rownames&lt;-(在内部某个时候使用与attr&lt;- 等效的属性)将以相同的方式(可能复制)。

    `row.names&lt;-.data.frame` 的行是

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

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

    【讨论】:

    • 非常感谢 - 很抱歉我的跟进非常延迟。因此,如果我理解正确,关键事实是 model.matrix 将原始行号作为行名,这几乎就是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 2019-10-15
    相关资源
    最近更新 更多