对于 R < 4.1.0 的版本,在 `apply()` 中模仿 `simplify=F`

Imitate `simplify=F` in `apply()` for versions of R < 4.1.0

给定一个二进制矩阵,我想按行生成一个 列表 1 的位置。例如:

> M <- matrix(c(1,1,0,0,1,1,1,0,1), 3, 3)
> M
     [,1] [,2] [,3]
[1,]    1    0    1
[2,]    1    1    0
[3,]    0    1    1
> apply(M==1, 1, which, simplify = FALSE)
[[1]]
[1] 1 3

[[2]]
[1] 1 2

[[3]]
[1] 2 3

然而,在4.1.0之前的R版本中,apply()函数会自动简化,这意味着结果有时不是列表,而是被简化为向量或矩阵。例如:

> apply(M==1, 1, which)
     [,1] [,2] [,3]
[1,]    1    1    2
[2,]    3    2    3

如何确保输出始终是一个列表,即使在早期版本的 R 中 simplify = F 参数对 apply() 不可用?谢谢!

您可以使用 asplit,它按选定的边距将矩阵拆分为向量列表。然后对结果使用 lapply 以将 which 应用于每个向量。

lapply(asplit(M == 1, 1), which)
#> [[1]]
#> [1] 1 3
#> 
#> [[2]]
#> [1] 1 2
#> 
#> [[3]]
#> [1] 2 3

我们可以使用 whicharr.ind = TRUE 然后 split 通过 'row'

ind <- which(M == 1, arr.ind = TRUE)
split(ind[,2], ind[, 1])
$`1`
[1] 1 3

$`2`
[1] 1 2

$`3`
[1] 2 3