对于 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
我们可以使用 which
和 arr.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
给定一个二进制矩阵,我想按行生成一个 列表 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
我们可以使用 which
和 arr.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