2014-11-04 75 views
0

我想在R中生成一個稀疏矩陣來表示一些虛擬編碼的變量。因此,矩陣每行應該只有一個'1'(所有其他值爲零)。所以,這樣的事情:R:生成每行只有一個值的稀疏矩陣(虛擬編碼)

0 0 1 0 
1 0 0 0 
0 1 0 0 
0 0 0 1 

是否有合理的方式來產生這樣一個矩陣?我能想到的最好的方法是創建代表每個可能行的向量,然後從這些向量中抽樣;但是這似乎有點遺憾。有更好的建議嗎?

編輯:這是我最終做的;確實是從矢量列表中抽取的。我猜,下面的解決方案更好,特別是縮放。

matrix(unlist(sample(list(c(1, 0, 0, 0), c(0, 1, 0, 0), c(0, 0, 1, 0), c(0, 0, 0, 1)), 
         size=93, replace=TRUE)), 93, 4, byrow=TRUE) 
+1

我希望,如果你通過他們'factor'變量,你都知道,R中的許多模型功能爲你做的假人編碼。 – Roland 2014-11-04 08:31:23

+0

也許另一種選擇:'diag(1,4,4)',除非你需要隨機位置上的1。 – 2014-11-04 09:11:59

+0

@ beginneR是的,我猜應該明確地說 - 需要隨機化。 – simoncolumbus 2014-11-04 23:10:02

回答

2

如果你想創建一個隨機的虛擬矩陣,一個快速的方法是創建這樣的功能:

Dummy <- function(nrow, ncol) { 
    M <- matrix(0L, nrow = nrow, ncol = ncol) 
    M[cbind(sequence(nrow), sample(ncol, nrow, TRUE))] <- 1L 
    M 
} 

第一該函數的行只是創建一個空的零矩陣。第二行使用矩陣索引來將每行正好替換一個值。第三行只是返回輸出。我不知道你是如何計劃創建/使用你的矢量的,但是這是我建議的方法......

用法很簡單:你只需要指定行數和最終矩陣應該有的列數。

例子:

set.seed(1) ## for reproducibility 
Dummy(3, 3) 
#  [,1] [,2] [,3] 
# [1,] 1 0 0 
# [2,] 0 1 0 
# [3,] 0 1 0 
Dummy(6, 4) 
#  [,1] [,2] [,3] [,4] 
# [1,] 0 0 0 1 
# [2,] 1 0 0 0 
# [3,] 0 0 0 1 
# [4,] 0 0 0 1 
# [5,] 0 0 1 0 
# [6,] 0 0 1 0 
+0

或'library(Matrix); sparseMatrix(i = sequence(nrow),j = sample(ncol,nrow,TRUE),x = 1)'得到一個真正的稀疏矩陣。 – flodel 2014-11-04 12:00:59

1

你可以使用model.matrix()

x <- factor(LETTERS[1:4]) 
model.matrix(~ 0 + x) 
+0

...並且如果OP想要一個*隨機*虛擬編碼矩陣,他可以這樣做:'x < - factor(sample(LETTERS,4,replace = TRUE))' – 2014-11-04 09:21:47