我在数组列表中选择特定矩阵时遇到问题:
我的数据集是一个列表。列表的每个元素都是一个数组,每个数组的每个元素自然都是一个矩阵。现在我想要的是从列表的每个元素中提取每个第n个(例如第二个)完整矩阵,并将它们组合成一个新数组。我已经找到了几个具有sapply和lapply的解决方案,当列表的元素是向量时工作得很好,但是将数组作为列表元素从中提取整个矩阵会增加额外的复杂度,我无法找到解决方案。
以下是一个例子:
#Create dataset
set.seed(1000)
D1<-array(runif(16), dim=c(4, 2, 2))
D2<-array(runif(16), dim=c(4, 2, 2))
D3<-array(runif(16), dim=c(4, 2, 2))
Dat<-list(D1, D2, D3)#This is how my data look like
#This works and produces exactly what I want
array(c(Dat[[1]][,,2], Dat[[2]][,,2], Dat[[3]][,,2]), dim=c(4, 2, 3))
最后一行代码手动生成我想要的内容。但是,最后列表将具有可变长度,并且数组也将具有不同的长度(尽管不是包含在相同列表中的数组,但它们总是具有相同的长度)。因此,我需要一种方法为列表中的所有数组自动选择每个数组的每个第n个矩阵。我尝试了一些东西,但它们都不起作用:
#This does not work at all
array(Dat[[]][,,2], dim=c(4, 2, 3))
array(Dat[[1:3]][,,2], dim=c(4, 2, 3))
array(Dat[[c(1, 2, 3)]][,,2], dim=c(4, 2, 3))
#This gives the the second row, first column of each matrix in the first array (i.e. first list element) only---absolutely not what I want
sapply(Dat, "[[", 2)
#Result
[1] 0.7588465 0.6351620 0.9661789
如果有人能帮我解决这个问题,请提前致谢。
答案 0 :(得分:1)
lapply( Dat , "[" , , , 2 )
#[[1]]
# [,1] [,2]
#[1,] 0.2157714 0.31708425
#[2,] 0.2561224 0.86581282
#[3,] 0.3499375 0.76416075
#[4,] 0.7554616 0.07288487
#
#...snip...
上面给出了一个矩阵列表。
要按照 @GavinSimpson 的建议获取数组,请执行以下操作:
simplify2array(lapply( Dat , "[" , , , 2 ))
(请参阅我之前的编辑,不太优雅的建议)
答案 1 :(得分:0)
另一种方法是从sapply
调用中重新定标返回的值:
temp <- sapply(Dat, "[", TRUE, TRUE, 2)
dim(temp) <- c(4,2,3)
temp
#-----------
, , 1
[,1] [,2]
[1,] 0.2157714 0.31708425
[2,] 0.2561224 0.86581282
[3,] 0.3499375 0.76416075
[4,] 0.7554616 0.07288487
, , 2
[,1] [,2]
[1,] 0.5483054 0.09076793
[2,] 0.6765533 0.12221227
[3,] 0.4518961 0.56751754
[4,] 0.8241250 0.04970992
, , 3
[,1] [,2]
[1,] 0.9962082 0.7979292
[2,] 0.5310467 0.7129898
[3,] 0.1099083 0.7028350
[4,] 0.6332116 0.5628327
答案 2 :(得分:0)
您可以尝试
library(abind)
ar1 <- abind(Dat, along=3)
ar1[,,seq(2,dim(ar1)[3], by=2)]