我有一个包含三列的表格(表 1):
id feature1 feature2
1 0.5 0.7
1 0.52 0.72
1 0.5 0.7
1 0.3 0.7
21 0.5 0.3
21 0.5 0.3
21 0.5 0.3
21 0.5 0.3
对于每个 id,我有特征 1 和特征 2 的四个时间点。从这个表中,我想构建一个 3D 数组 [id 数量,4(时间步长),2(特征数量)]。为此,我有以下代码:
trainData <- array(numeric(),c(0,4,2))
for(patient in 1:dim(ids)[1] ){
trainData<-abind(trainData,TABLE1[id==ids[patient],-c('id')],along=1)
}
ids 是一个表,其中包含表 1 的“ids”的唯一值。这段代码非常慢,我怎样才能获得相同的结果但速度更快?
我期望以下解决方案:
, , feature1
[,1] [,2] [,3] [,4]
[1,] 0.5 0.52 0.5 0.3
[2,] 0.5 0.50 0.5 0.5
, , feature2
[,1] [,2] [,3] [,4]
[1,] 0.7 0.72 0.7 0.7
[2,] 0.3 0.30 0.3 0.3
最佳答案
假设您想继续使用 abind 包,您可以简单地执行以下操作:
feature.list <- split(TABLE1[2:3], TABLE1$id)
feature.array <- abind(feature.list, along = 3)
这会生成一个带有方便标记尺寸的数字数组,无需循环:
, , 1
feature1 feature2
5 0.50 0.70
6 0.52 0.72
7 0.50 0.70
8 0.30 0.70
, , 21
feature1 feature2
5 0.5 0.3
6 0.5 0.3
7 0.5 0.3
8 0.5 0.3
如果TABLE1
是一个data.table,@Blaza指出可以使用data.table的split
方法来为abind准备数据帧
:
feature.list <- split(TABLE1, by = "id", keep.by = FALSE)
最后,要生成您想要的形状,您可以使用aperm
:
feature.array <- aperm(feature.array, c(3,1,2))
, , feature1
5 6 7 8
1 0.5 0.52 0.5 0.3
21 0.5 0.50 0.5 0.5
, , feature2
5 6 7 8
1 0.7 0.72 0.7 0.7
21 0.3 0.30 0.3 0.3
关于r - 从矩阵到 3D 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49984899/