清除表中的杂乱数据和缺失数据
此示例演示了如何查找、清除和删除具有缺失数据的行。
加载样本数据
从一个逗号分隔的文本文件 messy.csv
加载样本数据。该文件包含许多不同的缺失数据指示符:
空字符向量 ('')
句点 (.)
NA
NaN
-99
要指定将视为空值的字符向量,请将 'TreatAsMissing'
名称-值对组参数与 readtable
函数结合使用。(您可以使用 disp
函数来显示全部 21 行,即使以实时脚本方式运行此示例时也可以如此操作。)
T = readtable('messy.csv','TreatAsMissing',{'.','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 个变量的表。'TreatAsMissing'
仅适用于文件中的数值列,无法处理指定为文本形式的数值(例如 '-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
另请参阅
readtable
| summary
| ismissing
| sortrows
| standardizeMissing
| rmmissing
| fillmissing