从xls电子表格处理基本数据库的示例

使用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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180413G1G6BV00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券