从4d mat lab阵列到R中的2d矩阵或数据帧



我有一个数据集,它最初是一个Matlab.mat文件。当我将其导入R时,

列表中包含.mat文件内容的元素之一似乎是一个多维数组(准确地说是4d.

看起来有点像num[1:41,1:2400,1:60,1:6]。我知道这与2400次试验中的41个不同特征有关,因为60个人中的每一个人在每次试验中都会做出六分之一的选择。

由此,我真正想要的只是一个2d矩阵或数据帧,其中我可以有41列功能,一列试用,一列个人id,一列存储他们在特定试用中做出的选择。

因此,从本质上讲,每一行都将显示所有41个特征的值、个人ID、试用ID和他们的选择。最终,我需要能够在一个文件中共享,比如csv或txt。

有有效的方法吗?到目前为止,我的解决方案似乎非常复杂,需要相当多的循环和if语句。非常感谢

样本数据ary,假设它在某种程度上代表较大的矩阵。

ary <- array(seq(prod(c(4,10,3,2))), dim = c(4,10,3,2))
ary
# , , 1, 1
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]    1    5    9   13   17   21   25   29   33    37
# [2,]    2    6   10   14   18   22   26   30   34    38
# [3,]    3    7   11   15   19   23   27   31   35    39
# [4,]    4    8   12   16   20   24   28   32   36    40
# , , 2, 1
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]   41   45   49   53   57   61   65   69   73    77
# [2,]   42   46   50   54   58   62   66   70   74    78
# [3,]   43   47   51   55   59   63   67   71   75    79
# [4,]   44   48   52   56   60   64   68   72   76    80
# , , 3, 1
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]   81   85   89   93   97  101  105  109  113   117
# [2,]   82   86   90   94   98  102  106  110  114   118
# [3,]   83   87   91   95   99  103  107  111  115   119
# [4,]   84   88   92   96  100  104  108  112  116   120
# , , 1, 2
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]  121  125  129  133  137  141  145  149  153   157
# [2,]  122  126  130  134  138  142  146  150  154   158
# [3,]  123  127  131  135  139  143  147  151  155   159
# [4,]  124  128  132  136  140  144  148  152  156   160
# , , 2, 2
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]  161  165  169  173  177  181  185  189  193   197
# [2,]  162  166  170  174  178  182  186  190  194   198
# [3,]  163  167  171  175  179  183  187  191  195   199
# [4,]  164  168  172  176  180  184  188  192  196   200
# , , 3, 2
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]  201  205  209  213  217  221  225  229  233   237
# [2,]  202  206  210  214  218  222  226  230  234   238
# [3,]  203  207  211  215  219  223  227  231  235   239
# [4,]  204  208  212  216  220  224  228  232  236   240

转换它的三步过程:

tmp <- apply(ary, 3:4, function(z) as.data.frame(t(z)), simplify = FALSE)
eg <- do.call(expand.grid, lapply(dim(tmp), seq))
out <- do.call(rbind, Map(function(x, d3, d4) transform(x, dim3=d3, dim4=d4), c(tmp), eg[[1]], eg[[2]]))
dim(out)
# [1] 60  6
head(out)
#   V1 V2 V3 V4 dim3 dim4
# 1  1  2  3  4    1    1
# 2  5  6  7  8    1    1
# 3  9 10 11 12    1    1
# 4 13 14 15 16    1    1
# 5 17 18 19 20    1    1
# 6 21 22 23 24    1    1

详细信息:

  • CCD_ 2将在每个";平面";4d阵列。3:4表示第3维度和第4维度,保留前两个dim(分别为行和列(不变。在匿名函数的单个调用中,z是一个2d数组,例如ary[,,1,1]t将其转换为4列宽,这样您就可以在列维度中拥有自己的特性。

  • eg只是一种对三维和四维进行编号的机制,这样我们就可以记录每个平面的来源。这将返回一个帧,其中包含1:dim(ary)[3]1:dim(ary)[4]的所有组合,并且按照与执行c(tmp)时相同的顺序,保留编号的平面。看看head(eg),看看它是如何计数的。

  • CCD_ 12将CCD_ 13中的dim3/dim4值分配给每个平面。

  • CCD_ 14获取CCD_ 15的列表并产生单个帧。它类似于rbind(out[[1]], out[[2]], out[[3]], ...),但以一种与存储在out元素中的平面数量无关的方式完成。

最新更新