我试图在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)
答案 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)