我有一个数据集,它最初是一个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
元素中的平面数量无关的方式完成。