r - 从矩阵到 3D 数组

标签 r data.table

我有一个包含三列的表格(表 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/

相关文章:

r - 使用不等式表达式的内连接

r - 通过R中的4步以交替方式组合2个向量

r - 如何按组应用data.table中的函数然后在新列中输出结果?

R:对所有变量重复线性回归并将结果保存在新的数据框中

r - 绘制颜色十六进制代码矩阵

r - 执行此加入/合并的 "data table"方法是什么?

r - 如何使 R data.table 在像 data.frame 这样的列分配中回收时抛出错误?

用于 DPLYR 分辨率的 R Data.Table 解决方案

r - lassoshooting 和 glmnet 不同的结果

python - 将 Sage 矩阵赋值给 R 中的变量