【例3-61】 表中添加和删除变量。
首先载入病人的测试数据,然后创建两个表。其中一个表T,包含了问诊的信息,另一个表T1,包含了体检数据。
>> load patients
>> T = table(Age,Gender,Smoker);
>> T1 = table(Height,Weight,Systolic,Diastolic);
>> T(1:5,:)% 查看前五行数据
ans =
Age Gender Smoker
___ ________ ______
38 'Male' true
43 'Male' false
38 'Female' false
40 'Female' false
49 'Female' false
>> T1(1:5,:)% 查看前五行数据
ans =
Height Weight Systolic Diastolic
______ ______ ________ _________
71 176 124 93
69 163 109 77
64 131 125 83
67 133 117 75
64 119 122 80
表T有100行和3个变量,表T1有100行4个变量。横向合并两个表即可将变量添加到新表中。
>> T = [T T1];
>> T(1:5,:)% 查看前五行数据
ans =
Age Gender Smoker Height Weight Systolic Diastolic
___ ________ ______ ______ ______ ________ _________
38 'Male' true 71 176 124 93
43 'Male' false 69 163 109 77
38 'Female' false 64 131 125 83
40 'Female' false 67 133 117 75
49 'Female' false 64 119 122 80
现在表T具有7个变量了。
如果参与合并的两个表都有行名,那么横向合并表的时候相同行名的数据会合并到一起,这要求两个表必须有相同的行名,但行名的顺序可以不同。
用户可以通过列编号来删除变量,例如:
>> T(:,[3,6]) = [];% 删除第3个和第6个变量
查看删除之后表的前五行:
>> T(1:5,:)
ans =
Age Gender Height Weight Systolic
___ ________ ______ ______ ________
38 'Male' 71 176 124
43 'Male' 69 163 109
38 'Female' 64 131 125
40 'Female' 67 133 117
49 'Female' 64 119 122
这时表T有5个变量100行。
【例3-62】表的相关计算。
首先创建一个testScores.csv测试文件,其中包括以下内容,数据间采用逗号为分隔符。
LastName,Gender,Test1,Test2,Test3
HOWARD,male,90,87,93
WARD,male,87,85,83
TORRES,male,86,85,88
PETERSON,female,75,80,72
GRAY,female,89,86,87
RAMIREZ,female,96,92,98
JAMES,male,78,75,77
WATSON,female,91,94,92
BROOKS,female,86,83,85
KELLY,male,79,76,82
然后调用readtable函数由文件testScores.csv创建表,并使用第一列作为行名。
>> T = readtable('testScores.csv','ReadRowNames',true)
T =
Gender Test1 Test2 Test3
________ _____ _____ _____
HOWARD 'male' 90 87 93
WARD 'male' 87 85 83
TORRES 'male' 86 85 88
PETERSON 'female' 75 80 72
GRAY 'female' 89 86 87
RAMIREZ 'female' 96 92 98
JAMES 'male' 78 75 77
WATSON 'female' 91 94 92
BROOKS 'female' 86 83 85
KELLY 'male' 79 76 82
得到的数组T是一个10行4个变量的表。
调用summary函数来对表的数据类型、描述、单位和统计信息有一个汇总:
>> summary(T)
Variables:
Gender: 10x1 cell string
Test1: 10x1 double
Values:
min 75
median 86.5
max 96
Test2: 10x1 double
Values:
min 75
median 85
max 94
Test3: 10x1 double
Values:
min 72
median 86
max 98
从结果可以看到汇总信息中包含了每次考试的最低分、最高分和平均分。
假如需要计算每个人在各次考试中的平均分,那么需要对每行第2、3、4个变量进行求平均,并将结果赋值给新变量TestAvg:
>> T.TestAvg = mean(T{:,2:end},2)
T =
Gender Test1 Test2 Test3 TestAvg
-------- ----- ----- ----- -------
HOWARD 'male' 90 87 93 90
WARD 'male' 87 85 83 85
TORRES 'male' 86 85 88 86.333
PETERSON 'female' 75 80 72 75.667
GRAY 'female' 89 86 87 87.333
RAMIREZ 'female' 96 92 98 95.333
JAMES 'male' 78 75 77 76.667
WATSON 'female' 91 94 92 92.333
BROOKS 'female' 86 83 85 84.667
KELLY 'male' 79 76 82 79
除以上采用数值下标对变量进行寻访之外,用户还可以使用变量名进行寻访,例如T{:,{'Test1','Test2','Test3'}}。
如果要将所有数据分为男生和女生两组,然后分别计算两组的平均分,那么可以采用以下方法:
>> varfun(@mean,T,'InputVariables','TestAvg',...
'GroupingVariables','Gender')
ans =
Gender GroupCount mean_TestAvg
-------- ---------- ------------
female 'female' 5 87.067
male 'male' 5 83.4
当前满分是按照100分来设置的,如果需要将满分设置为25分,各人成绩按比例缩小,可以采用以下方法:
>> T{:,2:end} = T{:,2:end}*25/100
T =
Gender Test1 Test2 Test3 TestAvg
-------- ----- ----- ----- -------
HOWARD 'male' 22.5 21.75 23.25 22.5
WARD 'male' 21.75 21.25 20.75 21.25
TORRES 'male' 21.5 21.25 22 21.583
PETERSON 'female' 18.75 20 18 18.917
GRAY 'female' 22.25 21.5 21.75 21.833
RAMIREZ 'female' 24 23 24.5 23.833
JAMES 'male' 19.5 18.75 19.25 19.167
WATSON 'female' 22.75 23.5 23 23.083
BROOKS 'female' 21.5 20.75 21.25 21.167
KELLY 'male' 19.75 19 20.5 19.75
如果需要将学生多次考试的平均分作为期末的最终成绩,也就是将TestAvg变量名该为Final,那么采用以下方法:
>> T.Properties.VariableNames{end} = 'Final'
T =
Gender Test1 Test2 Test3 Final
-------- ----- ----- ----- ------
HOWARD 'male' 22.5 21.75 23.25 22.5
WARD 'male' 21.75 21.25 20.75 21.25
TORRES 'male' 21.5 21.25 22 21.583
PETERSON 'female' 18.75 20 18 18.917
GRAY 'female' 22.25 21.5 21.75 21.833
RAMIREZ 'female' 24 23 24.5 23.833
JAMES 'male' 19.5 18.75 19.25 19.167
WATSON 'female' 22.75 23.5 23 23.083
BROOKS 'female' 21.5 20.75 21.25 21.167
KELLY 'male' 19.75 19 20.5 19.75