使用csv2struct阅读电子表格
oasis_ss = csv2struct('oasis_longitudinal.xls')
oasis_ss = Subject_ID: MRI_ID: Group: Visit: MR_Delay: [373x1 double] M0x2FF: Hand: Age: [373x1 double] EDUC: [373x1 double] SES: MMSE: CDR: [373x1 double] eTIV: [373x1 double] nWBV: [373x1 double] ASF: [373x1 double]
这种类似电子表格的结构格式使修改字段变得容易
例如,csv2struct需要将M / F转换为一个有效的变量名称,该名称产生了M0x2FF;我们将用一个新的性别字段替换它:
oasis_ss.Gender = oasis_ss.M0x2FF;oasis_ss = rmfield(oasis_ss,'M0x2FF')
oasis_ss = Subject_ID: MRI_ID: Group: Visit: MR_Delay: [373x1 double] Hand: Age: [373x1 double] EDUC: [373x1 double] SES: MMSE: CDR: [373x1 double] eTIV: [373x1 double] nWBV: [373x1 double] ASF: [373x1 double] Gender:
请注意,性别是最后添加的,我们可以使用字段名称和命令字段将其正确地放在M0x2FF的原始位置,如果重要的话,或者甚至可以编写像上面使用的rmfield之类的mvfield方法。在这里,这是不值得的麻烦!
该格式不容易看到示例数据库“记录”
例如,性别如何被实际编码并不明显(例如条目“男性”和“女性”或“M”和“F”或0和1等)。排序电子表格也很繁琐,因为排序索引向量必须依次应用于每个变量。我们可以使用struct2struct转换为更类似数据库的格式:
oasis_db = struct2struct(oasis_ss)record1 = oasis_db(1)
oasis_db = 373x1 struct array with fields: Subject_ID MRI_ID Group Visit MR_Delay Hand Age EDUC SES MMSE CDR eTIV nWBV ASF Genderrecord1 = Subject_ID: 'OAS2_0001' MRI_ID: 'OAS2_0001_MR1' Group: 'Nondemented' Visit: '1' MR_Delay: 0 Hand: 'R' Age: 87 EDUC: 14 SES: 2 MMSE: 27 CDR: 0 eTIV: 1.9866e+003 nWBV: 0.6961 ASF: 0.8834 Gender: 'M'
现在让我们假设我们只想研究90岁以上的女性
female = strcmp(oasis_ss.Gender,'F');Nfemale = sum(female)age90plus = oasis_ss.Age > 90;% (请注意,字段名称区分大小写。)
Nage90s = sum(age90plus)Nboth = sum(female & age90plus)
Nfemale = 213Nage90s = 16Nboth = 13
使用电子表格格式,很容易获得这些过滤指示变量,但过滤本身(依次处理每个变量)会很繁琐。过滤数据库非常简单:
oasis_db = oasis_db(female & age90plus)
oasis_db = 13x1 struct array with fields: Subject_ID MRI_ID Group Visit MR_Delay Hand Age EDUC SES MMSE CDR eTIV nWBV ASF Gender
数据库格式的直接筛选和排序也是可能的
[ind ind] = sort([oasis_db.Age]);%括号(使用大括号表示字符串)
oasis_db = oasis_db(ind);youngest = oasis_db(1)oldest = oasis_db(end)
youngest = Subject_ID: 'OAS2_0031' MRI_ID: 'OAS2_0031_MR3' Group: 'Converted' Visit: '3' MR_Delay: 1588 Hand: 'R' Age: 91 EDUC: 12 SES: 3 MMSE: 28 CDR: 0.5000 eTIV: 1.4632e+003 nWBV: 0.6955 ASF: 1.1994 Gender: 'F'oldest = Subject_ID: 'OAS2_0087' MRI_ID: 'OAS2_0087_MR2' Group: 'Demented' Visit: '2' MR_Delay: 754 Hand: 'R' Age: 98 EDUC: 17 SES: 1 MMSE: 21 CDR: 2 eTIV: 1.5028e+003 nWBV: 0.6596 ASF: 1.1678 Gender: 'F'
任何一种格式都可以用于简单的计算
例如,我们子集的平均总颅内容积(毫升):
subset_mean_eTIV_a = mean(oasis_ss.eTIV(female & age90plus))subset_mean_eTIV_b = mean([oasis_db.eTIV])
subset_mean_eTIV_a = 1.4542e+003subset_mean_eTIV_b = 1.4542e+003
激励MATLAB处理电子表格/数据库的一个例子
这可能在这里似乎没有任何意义(为什么不使用电子表格应用程序来计算平均值等),但这种方法的关键优势在于与其他MATLAB工具的集成,例如用于比大多数电子表格软件更高级的数据处理。另外,请注意,甚至在电子表格中(如图)可能的事情可能更容易在MATLAB中进行编程,因此例如重复使用多个数据子集(男性,女性,左撇子等等)上的代码绘图变得更容易。
forGender ='MF'selected = strcmp(oasis_ss.Gender, Gender); figure; plot(oasis_ss.Age(selected), oasis_ss.nWBV(selected),'x') title(sprintf('Atrophy in %s', Gender)) xlabel('Age (years)') ylabel('Normalised whole brain volume (ml)')end
领取专属 10元无门槛券
私享最新 技术干货