加载样本数据
从一个逗号分隔的文本文件 messy.csv 加载样本数据。该文件包含许多不同的缺失数据指示符:
空字符向量 ('')
句点 (.)
NA
NaN
-99
要指定将视为空值的字符向量,请将 'TreatAsEmpty' 名称-值对组参数与 readtable 函数结合使用。(您可以使用 disp 函数来显示全部 21 行,即使以实时脚本方式运行此示例时也可以如此操作。)
T = readtable('messy.csv','TreatAsEmpty',{'.','NA'});
disp(T)
A B C D E
________ ____ __________ ____ ____
{'afe1'} 3 {'yes' } 3 3
{'egh3'} NaN {'no' } 7 7
{'wth4'} 3 {'yes' } 3 3
{'atn2'} 23 {'no' } 23 23
{'arg1'} 5 {'yes' } 5 5
{'jre3'} 34.6 {'yes' } 34.6 34.6
{'wen9'} 234 {'yes' } 234 234
{'ple2'} 2 {'no' } 2 2
{'dbo8'} 5 {'no' } 5 5
{'oii4'} 5 {'yes' } 5 5
{'wnk3'} 245 {'yes' } 245 245
{'abk6'} 563 {0x0 char} 563 563
{'pnj5'} 463 {'no' } 463 463
{'wnn3'} 6 {'no' } 6 6
{'oks9'} 23 {'yes' } 23 23
{'wba3'} NaN {'yes' } NaN 14
{'pkn4'} 2 {'no' } 2 2
{'adw3'} 22 {'no' } 22 22
{'poj2'} -99 {'yes' } -99 -99
{'bas8'} 23 {'no' } 23 23
{'gry5'} NaN {'yes' } NaN 21
T 是一个包含 21 行和 5 个变量的表。'TreatAsEmpty' 仅适用于文件中的数值列,无法处理指定为文本形式的数值(例如 '-99')。
汇总表
使用 summary 函数创建汇总表来查看每个变量的数据类型、说明、单位和其他描述性统计量。
summary(T)
Variables:
A: 21x1 cell array of character vectors
B: 21x1 double
Values:
Min -99
Median 14
Max 563
NumMissing 3
C: 21x1 cell array of character vectors
D: 21x1 double
Values:
Min -99
Median 7
Max 563
NumMissing 2
E: 21x1 double
Values:
Min -99
Median 14
Max 563
当从文件中导入数据时,默认情况是让 readtable 以字符向量元胞数组形式读取包含非数值元素的任何变量。
查找具有缺失值的行
显示表 T 中至少具有一个缺失值的行子集。
TF = ismissing(T,{'' '.' 'NA' NaN -99});
rowsWithMissing = T(any(TF,2),:);
disp(rowsWithMissing)
A B C D E
________ ___ __________ ___ ___
{'egh3'} NaN {'no' } 7 7
{'abk6'} 563 {0x0 char} 563 563
{'wba3'} NaN {'yes' } NaN 14
{'poj2'} -99 {'yes' } -99 -99
{'gry5'} NaN {'yes' } NaN 21
readtable 已将数值变量 B、D 和 E 中的 '.' 和 'NA' 替换为 NaN。
替换缺失值指示符
清除相应数据,以将代码 -99 所指示的缺失值替换为标准的 MATLAB® 数值缺失值指示符 NaN。
T = standardizeMissing(T,-99);
disp(T)
A B C D E
________ ____ __________ ____ ____
{'afe1'} 3 {'yes' } 3 3
{'egh3'} NaN {'no' } 7 7
{'wth4'} 3 {'yes' } 3 3
{'atn2'} 23 {'no' } 23 23
{'arg1'} 5 {'yes' } 5 5
{'jre3'} 34.6 {'yes' } 34.6 34.6
{'wen9'} 234 {'yes' } 234 234
{'ple2'} 2 {'no' } 2 2
{'dbo8'} 5 {'no' } 5 5
{'oii4'} 5 {'yes' } 5 5
{'wnk3'} 245 {'yes' } 245 245
{'abk6'} 563 {0x0 char} 563 563
{'pnj5'} 463 {'no' } 463 463
{'wnn3'} 6 {'no' } 6 6
{'oks9'} 23 {'yes' } 23 23
{'wba3'} NaN {'yes' } NaN 14
{'pkn4'} 2 {'no' } 2 2
{'adw3'} 22 {'no' } 22 22
{'poj2'} NaN {'yes' } NaN NaN
{'bas8'} 23 {'no' } 23 23
{'gry5'} NaN {'yes' } NaN 21
standardizeMissing 将三个 -99 替换为 NaN。
创建一个新表 T2,然后将缺失值替换为该表的前一行中的值。fillmissing 提供了许多方法来填充缺失值。
T2 = fillmissing(T,'previous');
disp(T2)
A B C D E
________ ____ _______ ____ ____
{'afe1'} 3 {'yes'} 3 3
{'egh3'} 3 {'no' } 7 7
{'wth4'} 3 {'yes'} 3 3
{'atn2'} 23 {'no' } 23 23
{'arg1'} 5 {'yes'} 5 5
{'jre3'} 34.6 {'yes'} 34.6 34.6
{'wen9'} 234 {'yes'} 234 234
{'ple2'} 2 {'no' } 2 2
{'dbo8'} 5 {'no' } 5 5
{'oii4'} 5 {'yes'} 5 5
{'wnk3'} 245 {'yes'} 245 245
{'abk6'} 563 {'yes'} 563 563
{'pnj5'} 463 {'no' } 463 463
{'wnn3'} 6 {'no' } 6 6
{'oks9'} 23 {'yes'} 23 23
{'wba3'} 23 {'yes'} 23 14
{'pkn4'} 2 {'no' } 2 2
{'adw3'} 22 {'no' } 22 22
{'poj2'} 22 {'yes'} 22 22
{'bas8'} 23 {'no' } 23 23
{'gry5'} 23 {'yes'} 23 21
删除具有缺失值的行
创建一个新表 T3,该表仅包含 T 中不带缺失值的行。T3 只有 16 行。
T3 = rmmissing(T);
disp(T3)
A B C D E
________ ____ _______ ____ ____
{'afe1'} 3 {'yes'} 3 3
{'wth4'} 3 {'yes'} 3 3
{'atn2'} 23 {'no' } 23 23
{'arg1'} 5 {'yes'} 5 5
{'jre3'} 34.6 {'yes'} 34.6 34.6
{'wen9'} 234 {'yes'} 234 234
{'ple2'} 2 {'no' } 2 2
{'dbo8'} 5 {'no' } 5 5
{'oii4'} 5 {'yes'} 5 5
{'wnk3'} 245 {'yes'} 245 245
{'pnj5'} 463 {'no' } 463 463
{'wnn3'} 6 {'no' } 6 6
{'oks9'} 23 {'yes'} 23 23
{'pkn4'} 2 {'no' } 2 2
{'adw3'} 22 {'no' } 22 22
{'bas8'} 23 {'no' } 23 23
T3 包含 16 行和 5 个变量。
组织数据
先根据 C 以降序对 T3 的行进行排序,然后根据 A 以升序排序。
T3 = sortrows(T2,{'C','A'},{'descend','ascend'});
disp(T3)
A B C D E
________ ____ _______ ____ ____
{'abk6'} 563 {'yes'} 563 563
{'afe1'} 3 {'yes'} 3 3
{'arg1'} 5 {'yes'} 5 5
{'gry5'} 23 {'yes'} 23 21
{'jre3'} 34.6 {'yes'} 34.6 34.6
{'oii4'} 5 {'yes'} 5 5
{'oks9'} 23 {'yes'} 23 23
{'poj2'} 22 {'yes'} 22 22
{'wba3'} 23 {'yes'} 23 14
{'wen9'} 234 {'yes'} 234 234
{'wnk3'} 245 {'yes'} 245 245
{'wth4'} 3 {'yes'} 3 3
{'adw3'} 22 {'no' } 22 22
{'atn2'} 23 {'no' } 23 23
{'bas8'} 23 {'no' } 23 23
{'dbo8'} 5 {'no' } 5 5
{'egh3'} 3 {'no' } 7 7
{'pkn4'} 2 {'no' } 2 2
{'ple2'} 2 {'no' } 2 2
{'pnj5'} 463 {'no' } 463 463
{'wnn3'} 6 {'no' } 6 6
在 C 中,各行首先按 'yes' 分组,然后再按 'no' 分组。然后在 A 中,各行以字母顺序排列。
对表进行重新排序,以使 A 和 C 彼此相邻。
T3 = T3(:,{'A','C','B','D','E'});
disp(T3)
A C B D E
________ _______ ____ ____ ____
{'abk6'} {'yes'} 563 563 563
{'afe1'} {'yes'} 3 3 3
{'arg1'} {'yes'} 5 5 5
{'gry5'} {'yes'} 23 23 21
{'jre3'} {'yes'} 34.6 34.6 34.6
{'oii4'} {'yes'} 5 5 5
{'oks9'} {'yes'} 23 23 23
{'poj2'} {'yes'} 22 22 22
{'wba3'} {'yes'} 23 23 14
{'wen9'} {'yes'} 234 234 234
{'wnk3'} {'yes'} 245 245 245
{'wth4'} {'yes'} 3 3 3
{'adw3'} {'no' } 22 22 22
{'atn2'} {'no' } 23 23 23
{'bas8'} {'no' } 23 23 23
{'dbo8'} {'no' } 5 5 5
{'egh3'} {'no' } 3 7 7
{'pkn4'} {'no' } 2 2 2
{'ple2'} {'no' } 2 2 2
{'pnj5'} {'no' } 463 463 463
{'wnn3'} {'no' } 6 6 6