背景

我使用R.matlab的read.mat()函数将一个数据集从MATLAB导入到R中 .

它给了我一个三维的列表数组,每个列表中都有一个矩阵 . 以下是其输出的一些示例 .

, , 1

           [,1]         
experiment 5         
reader     "A"          
time       Numeric,20002
value      Numeric,20002

本质上,此数组包含许多实验,其中实验及其相关信息由第三个索引访问 . 与每个实验相关联的是实验编号,读者姓名,在这些时间具有相应的值序列的时间测量序列(考虑时间序列但是时间和值分成两个单独的部分) .

就像我说的,数组的内容是包含矩阵的列表 . 所以这意味着“实验”旁边的值为5的条目实际上是一个带有1乘1矩阵的列表 . 类似地,“值”旁边的条目是具有10002乘1矩阵的列表,其基本上是矢量 .

现在,我通过删除数组的无关第二维,将其转换为矩阵,并将列表中的矩阵转换为向量,稍微简化了这种结构 . 重新格式化的数组的输出如下所示 .

experiment reader time           value         
[1,] 4          "A"    Numeric,100002 Numeric,100002
[2,] 8          "B"    Numeric,100002 Numeric,100002
[3,] 12         "C"    Numeric,100002 Numeric,100002
[4,] 16         "D"    Numeric,100002 Numeric,100002
[5,] 20         "E"    Numeric,100002 Numeric,100002

问题

我的主要问题是这是否真的是一种在R中构建这些数据的合适方法 . 我觉得我正在与R中的固有构造作斗争以使其发挥作用,但话说回来,我对R的经验相对较少 .

我喜欢这种格式的原因是因为包含时间和值向量的列表可以通过它们的相关实验编号或读者名称轻松找到,这允许快速子集化 . 例如,如果矩阵的名称是“e”

e[ e[, "experiment"] == c(4, 8), ]
e[ e[, "reader"] == "A", "value"]

看起来我应该在这里使用data.frame,但我不确定 . 我尝试构建它的另一种方法是使用data.frame的长格式,其中向量中的每个数据点都被取出并与实验编号和读者名称相关联 . 这个data.frame看起来像这样 .

experiment reader    time    value
1          4      A 1.45650 2.330000
2          4      A 1.96705 2.596625
3          4      A 2.47760 2.863250
4          4      A 2.98815 3.129875
5          4      A 3.49870 3.396500

这种格式有点简单,因为我不必担心处理矩阵格式的列表转换 . 但是,我必须手动重新创建时间和值的向量,这在搜索这个明显更大的data.frame时可能会非常耗时 . 例如,如果data.frame的名称是“y”

y[ y[, "experiment"] == 4, ]$time 
y[ y[, "experiment"] == 4, ]$value

有没有人有什么建议?