从向量列表中创建一个 2x2 矩阵列表
Posted
技术标签:
【中文标题】从向量列表中创建一个 2x2 矩阵列表【英文标题】:Make a list of 2x2 matrices from a list of vectors 【发布时间】:2022-01-08 11:44:47 【问题描述】:我想从这个列表中列出四个 2x2 矩阵
str(SC_sum)
List of 4
$ : Named num [1:4] 0.5927 0.2927 0.5977 0.0227
..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"
$ : Named num [1:4] 0.408 0.705 0.401 0.4
..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"
$ : Named num [1:4] 0.0758 0.1521 0.1028 0.0757
..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"
$ : Named num [1:4] 0.924 0.848 0.897 0.454
..- attr(*, "names")= chr [1:4] "chisel" "disc" "field_cultivator" "moldboard"
lapply(SC_sum, "matrix", nrow = 2, byrow = T)
我希望我的chisel
矩阵是matrix(c(0.5926667, 0.4083333, 0.0758125, 0.9240000), nrow = 2, byrow = F)
,这是SC_sum
中四个向量中每个向量中的第一个元素,然后disc
矩阵是@ 中每个向量中第二个元素的组合987654327@等。
我当前的chisel
矩阵是matrix(c(0.59266667, 0.29266667, 0.59766667, 0.02266667), nrow = 2, byrow = F)
,这是第一个向量的重新排列。如何更改我的代码?非常感谢!
【问题讨论】:
【参考方案1】:这个怎么样?在这里,x
正在取代您的 SC_sum
。
x <- split(seq_len(16), gl(4, 4))
x <- lapply(x, `names<-`, letters[1:4])
x
$`1`
a b c d
1 2 3 4
$`2`
a b c d
5 6 7 8
$`3`
a b c d
9 10 11 12
$`4`
a b c d
13 14 15 16
m <- matrix(unlist(x), nrow = length(x[[1]]), ncol = length(x),
dimnames = list(names(x[[1]]), NULL))
m
[,1] [,2] [,3] [,4]
a 1 5 9 13
b 2 6 10 14
c 3 7 11 15
d 4 8 12 16
l <- apply(m, 1, matrix, ncol = 2, simplify = FALSE)
l
$a
[,1] [,2]
[1,] 1 9
[2,] 5 13
$b
[,1] [,2]
[1,] 2 10
[2,] 6 14
$c
[,1] [,2]
[1,] 3 11
[2,] 7 15
$d
[,1] [,2]
[1,] 4 12
[2,] 8 16
如果你真的想使用lapply
而不是apply
,那么你可以这样做:
index <- seq_along(x[[1]])
names(index) <- names(x[[1]])
l <- lapply(index, function(i) matrix(vapply(x, `[[`, 0, i), ncol = 2))
但是由于您的数据基本上是矩形的,因此(我认为)构造和操作矩阵要直观得多。
【讨论】:
非常感谢。vapply
提示对我很有效。以上是关于从向量列表中创建一个 2x2 矩阵列表的主要内容,如果未能解决你的问题,请参考以下文章
从具有不同基因的受试者列表中创建一个矩阵,这些基因存在或不存在于 python