Dav*_*idR 4 r model.matrix data.table
我有一个data.table
DT
,我想继续model.matrix
它.每行都有一个字符串ID,存储在ID
列中DT
.当我跑步model.matrix
时DT
,我的公式排除了ID
列.问题是,model.matrix
由于NA而丢弃了一些行.如果我设置的rownames DT
到ID
列,调用之前model.matrix
,那么最终的模型矩阵具有rownames,和我都准备好.否则,我无法弄清楚我最终会遇到什么行.我正在设置rownames rownames(DT) = DT$ID
.但是,当我尝试添加新列时DT
,我会收到投诉
"检测到无效的.internal.selfref ......在早些时候,这个data.table已经被R复制了."
所以我很想知道
data.table
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,所以没有必要设置它们.