在R中将二进制矩阵按行转换为列索引列表

4

给定一个二进制矩阵 B,通常可以使用Blist <- apply(B==1, 1, which)来按行列出 1 的列索引列表。然而,当例如 rowSums(B)[1] == rowSums(B)[2] 时,这种方式就行不通了。

下面是一个适用的示例:

> B <- matrix(c(1,1,0,0,1,0,0,0,1),3,3)
> B
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    1    1    0
[3,]    0    0    1
> Blist <- apply(B==1, 1, which)
> Blist
[[1]]
[1] 1

[[2]]
[1] 1 2

[[3]]
[1] 3

以下是一种无法正常运行的示例:

> B <- matrix(c(1,0,0,0,1,0,0,0,1),3,3)
> B
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1
> Blist <- apply(B==1, 1, which)
> Blist
[1] 1 2 3

在这种情况下,期望的结果是:

> Blist
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

我该如何修改Blist <- apply(B==1, 1, which),以使结果始终组织为列表?
2个回答

4

默认情况下,apply函数有一个名为simplify的逻辑型参数,默认值为TRUE。从?apply的文档中可以了解到:

apply(X, MARGIN, FUN, ..., simplify = TRUE)

simplify - 一个逻辑型变量,表示是否尝试简化结果。

如果FUN的调用返回长度不同的向量或simplify参数为FALSE,则apply将返回一个列表,其长度为prod(dim(X)[MARGIN]),如果MARGIN的长度大于1,则dim设置为MARGIN。

apply(B==1, 1, which, simplify = FALSE)
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

2
m = which(B == 1, arr.ind=TRUE)
split(m[,"col"], m[,"row"])
# $`1`
# [1] 1

# $`2`
# [1] 2

# $`3`
# [1] 3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接