如何从二元指标矩阵创建因子?

时间:2011-10-11 14:03:55

标签: r

假设我有以下矩阵mat,这是一组5个观察值的ABC级别的二元指标矩阵:< / p>

mat <- matrix(c(1,0,0,
                1,0,0,
                0,1,0,
                0,1,0,
                0,0,1), ncol = 3, byrow = TRUE)
colnames(mat) <- LETTERS[1:3]

> mat
     A B C
[1,] 1 0 0
[2,] 1 0 0
[3,] 0 1 0
[4,] 0 1 0
[5,] 0 0 1

我想将其转换为单个因子,使得输出等同于fac定义为:

> fac <- factor(rep(LETTERS[1:3], times = c(2,2,1)))
> fac
[1] A A B B C
Levels: A B C

如果您从mat的合命名中获取标签,则可获得额外积分,但也可接受一组数字代码(例如c(1,1,2,2,3))作为所需的输出。

5 个答案:

答案 0 :(得分:15)

矩阵乘法的优雅解决方案(迄今为止最短):

as.factor(colnames(mat)[mat %*% 1:ncol(mat)])

答案 1 :(得分:8)

此解决方案使用arr.ind=TRUE的{​​{1}}参数,将匹配的位置作为数组位置返回。然后将它们用于索引which

colnames

分解为步骤:

> factor(colnames(mat)[which(mat==1, arr.ind=TRUE)[, 2]])
[1] A A B B C
Levels: A B C

使用第二列的值,即> which(mat==1, arr.ind=TRUE) row col [1,] 1 1 [2,] 2 1 [3,] 3 2 [4,] 4 2 [5,] 5 3 和索引which(...)[, 2]

colnames

然后转换为因子

答案 2 :(得分:5)

一种方法是使用矩阵直接按行号和索引复制名称,然后用factor将其换行以恢复级别:

factor(rep(colnames(mat), each = nrow(mat))[as.logical(mat)])
[1] A A B B C
Levels: A B C

如果这是来自model.matrix,则列号前缀为fac,因此这应该相同但删除额外的文本:

factor(gsub("^fac", "", rep(colnames(mat), each = nrow(mat))[as.logical(mat)]))

答案 3 :(得分:4)

您可以使用以下内容:

lvls<-apply(mat, 1, function(currow){match(1, currow)})
fac<-factor(lvls, 1:3, labels=colnames(mat))

答案 4 :(得分:1)

这是另一个

factor(rep(colnames(mat), colSums(mat)))