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

Dav*_*idR 4 r model.matrix data.table

我有一个data.table DT,我想继续model.matrix它.每行都有一个字符串ID,存储在ID列中DT.当我跑步model.matrixDT,我的公式排除了ID列.问题是,model.matrix由于NA而丢弃了一些行.如果我设置的rownames DTID列,调用之前model.matrix,那么最终的模型矩阵具有rownames,和我都准备好.否则,我无法弄清楚我最终会遇到什么行.我正在设置rownames rownames(DT) = DT$ID.但是,当我尝试添加新列时DT,我会收到投诉

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

所以我很想知道

  1. 有没有更好的方法来设置一个rownames data.table
  2. 有没有更好的方法来解决这个问题.

mne*_*nel 10

这里有几个问题.

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

但是,它不是世界末日.model.matrix当你传递它时,它会返回合理的rownamesdata.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"
Run Code Online (Sandbox Code Playgroud)

因此,行2,3和5是包含在model.matrix中的行.

现在,您可以将此序列添加为列A.如果您将密钥设置为其他内容(从而丢失原始订单),这将非常有用

A[, rowid := seq_len(nrow(A)]
Run Code Online (Sandbox Code Playgroud)

您可以考虑将其设置为字符(如rownames mm),但它并不重要(因为您可以rownames(mm)在需要引用时轻松转换 为数字).

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

避免使用键< - ,名称< - 和attr < - 当前(并且奇怪地)在R中可以复制整个data.table.使用set*语法来避免复制:setkey(),setnames()和setattr()

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

这条线`row.names<-.data.frame`

attr(x, "row.names") <- value
Run Code Online (Sandbox Code Playgroud)

话虽这么说,data.tables没有rownames,所以没有必要设置它们.