R:生成一个稀疏矩阵,每行只有一个值(虚拟编码)

时间:2014-11-04 08:26:06

标签: r matrix sparse-matrix

我试图在R中生成一个稀疏矩阵来表示一些虚拟编码变量。因此,矩阵每行应该只有一个'1'(所有其他值都为零)。所以,像这样:

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

是否有合理的方法来生成这样的矩阵?我能想到的最好的事情是创建代表每条可能线的 j 向量,然后从这些向量中进行采样;但这似乎有些愚蠢。还有更好的建议吗?

编辑:这是我最终做的;确实从矢量列表中采样。我猜,下面的解决方案非常出色,特别是对于缩放。

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)

2 个答案:

答案 0 :(得分:2)

如果你想创建一个随机虚拟矩阵,一个快速的方法是创建一个这样的函数:

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

该函数的第一行只是创建一个空的零矩阵。第二行使用矩阵索引,每行只用一个值替换一个值。第三行只返回输出。我不确定你是如何计划创建/使用 j 向量的,但这就是我建议接近它的方式....

用法很简单:您只需指定行数和最终矩阵应具有的列数。

示例:

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

答案 1 :(得分:1)

您可以使用model.matrix()

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