如何用一行代码从计数数组构建指定结构的0-1矩阵?
问题:生成指定0-1矩阵的简洁一行代码实现
给定一个长度为6、包含3个唯一值的数组(示例:c(1,1,1,2,3,3)),需构建如下6×3的0-1矩阵:
[1, 0 , 0] [1, 0 , 0] [1, 0 , 0] [0, 1 , 0] [0, 0, 1] [0, 0, 1]
已有基础实现方式:
V = c(1,1,1,2,3,3) Z = matrix(0,6,3) for (i in 1:6) {Z[i, V[i]] = 1}
请问是否存在更简洁的一行代码实现该操作?
回答
当然有,这里提供两种简洁的一行代码实现方式:
方法一:利用单位矩阵索引
V <- c(1,1,1,2,3,3) Z <- diag(length(unique(V)))[V, ]
原理很直接:先创建维度等于数组唯一值数量的单位矩阵,再通过数组V的元素作为行索引提取对应行,就能得到目标0-1矩阵。
方法二:利用model.matrix函数
V <- c(1,1,1,2,3,3) Z <- model.matrix(~ factor(V) - 1)
该方法将V转为因子后,生成无截距项的设计矩阵,结果完全符合要求,唯一区别是矩阵列名会带有因子标识(比如factor(V)1),如果不需要可后续用colnames(Z) <- NULL去除。
内容的提问来源于stack exchange,提问作者WeakLearner
相关产品推荐
相关产品推荐

