2012-12-20 36 views
4

我有一個data.tableDT我想運行model.matrix就可以了。每行都有一個字符串ID,它存儲在列DT中。當我在DT上運行model.matrix時,我的公式不包括ID列。問題是,由於NAs,model.matrix刪除了一些行。如果我將DT的排名設置爲ID列,則在致電model.matrix之前,最終的模型矩陣有rownames,我已經設置好了。否則,我無法弄清楚結束了哪些行。我用rownames(DT) = DT$ID設置了rownames。然而,當我嘗試將新列添加到DT,我得到一個關於R的data.table Rownames爲model.matrix

投訴「無效.internal.selfref檢測。在早期的點,這 data.table已被複制的R. 「

所以我不知道

  1. 是否有更好的方法來設置rownames的data.table
  2. 是否有解決這個問題的一個更好的辦法。

回答

10

這裏有幾個問題。

首先,它是data.table的一項功能,它們沒有rownames,而是具有更強大的key。見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" 

所以行2,3和5被那些包括在model.matrix model.matrix返回明智rownames。

現在,您可以將此序列作爲列添加到A。這將是有用的,如果你再設置鍵,其他的東西(從而失去原來的順序)

A[, rowid := seq_len(nrow(A)] 

你可能會考慮將它字符(像mm的rownames)),但它不會真正的問題(如你可以很容易地轉換到rownames(mm)數字,當你需要引用

至於警告data.table給,如果你讀下句

避免關鍵< - ,名< - 一個d attr < - 目前R(奇​​怪地)可以複製整個data.table。使用SET *語法來避免複製:setkey的(),setnames()和SETATTR()

rownames是一個屬性rownames<-(內部在使用相當於attr<- somepoint)以同樣的方式將(可能複製) 。

線從`row.names<-.data.frame`

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

話雖這麼說,data.tables沒有rownames,所以沒有點設置它們。

+1

非常感謝 - 抱歉,我的延誤後續行動。因此,如果我理解正確,關鍵的事實是model.matrix將原始行號作爲行名稱,這幾乎是我所需要的。 – DavidR