我使用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
有人有任何建议吗?