How to| 替换或删除无效或丢失的数据

在对一个数据集进行数据分析之前,通常需要对其进行清理. 缺少项或包含无效值的数据点必须删除或用某些估计值替换. Mathematica 为这类预处理提供一个丰富的环境.

常常使用一个特定的符号、字符串或超出范围的数来表示数据集中丢失的信息. 在 Mathematica 的内置数据函数中,用符号 Missing 来实现此目的.

下面获取 CountryData 中每个国家的国内生产总值(GDP). 分号()在此阻止了这一大型输出:

In[1]:=
Click for copyable input

这里显示按字母顺序排序的前10个国家的 的值:

In[2]:=
Click for copyable input
Out[2]=

您可能想对这组数据进行某些分析,例如求 GDP 的最大值,但对于某些国家,这些值不可用.

最大值不能完全由原始数据决定:

In[3]:=
Click for copyable input
Out[3]=

出于某些原因,数据可能会丢失,但 CountryData 将用 Missing 开始的表达式将它们全部表示出. 数据集中丢失值的个数可以通过计算以 Missing 开头的表达式来得到.

Count 与模式 联合使用,来对以 Missing 开头的表达式计数:

In[4]:=
Click for copyable input
Out[4]=

与整个数据集中数据点的个数相比,值丢失的数据点个数相对很小:

In[5]:=
Click for copyable input
Out[5]=

删除丢失的点,并对其余各点进行分析是相当合理的. 删除这些数据点的一种简单的方法是将 DeleteCasesCount 中用于 Missing 表达式的相同模式联合使用:

In[6]:=
Click for copyable input

根据新数据集的长度和最大值,您可以看到丢失的值已经被删除:

In[7]:=
Click for copyable input
Out[7]=

任何能在一个数列上进行的计算,现在可以在筛选后的新数据集上进行.

    

在前面的示例中,无效数据点的一个非常具体的形式是已知的:它们都以 Missing 开始. 在实际操作中,用于表示丢失信息的方法各有不同. 在电子表格中输入数据的人可能会用 NA 来表示不可用或不适用的值,而有些数据采集软件可能会以一个特定的超出范围数来表示丢失的值. 因此,知道数据表示什么从而确定哪些值是无效的,这一点非常重要.

在这个数据集中,第一个元素表示两组之一的组号,而另外两个元素表示该组中一个成员的测量值:

In[8]:=
Click for copyable input

将数据显示在网格中,能比较容易地看出哪些数据存在问题:

In[9]:=
Click for copyable input
Out[9]=

在这个例子中,存在两个问题. 尽管只有两个组,1和2,但有一项的组号为4. 另外,第三列中有一个非数值项. 需要采取某些措施来删除或修改这些存在问题的点.

在这个数据集中,第一个元素的有效输入应该是1或2,第二和第三个元素应该为数值. 该类型数据的模式为 . 符号 表示两种选择非此即彼:第一个元素必须为1或2. NumberQ 测试其参数是否是一个数值,而 是一个数值模式. 您可将该模式与 MatchQNot 一起使用来写一个函数对坏数据点进行识别.

该函数通过检查其输入是否与模式匹配来识别这类点. 如果输入与模式不匹配,则返回 True

In[10]:=
Click for copyable input

如要删除无效的数据点,您可在 DeleteCases 中用 作为模式:

In[11]:=
Click for copyable input
Out[11]=

通常需要将无效值用基于其它数据点的估计值来取代,而不是完全将其删除. 但对于当前的数据集中组号4的处理,除了随机选择1或2替换外还能如何进行尚不明了. 这种情况下,您可能仍然希望对数据点进行删除.

定义一个函数 ,它通过检查各项的第一个元素是否为1或2,来确定一个组号的输入是否有效:

In[12]:=
Click for copyable input

用于 DeleteCases 删除具有无效组号值的数据点:

In[13]:=
Click for copyable input
Out[13]=

由于 是第三列中唯一一个没有数据的项,并且属于第一组,您可以用第三列中所有属于第一组的其它数据点的均值或中位数来替换.

用均值来替换可通过选择第一组的数据点,计算所有值为数字的第三个元素的均值,并用该均值代替 直接实现.

使用 Select 从第一组中选出数据点:

In[14]:=
Click for copyable input
Out[14]=

再次使用 Select 选出 数据中所有值为数字的最后一个元素(第三列),然后计算它们的均值:

In[15]:=
Click for copyable input
Out[15]=

现在使用一个替换规则用均值来替换 :

In[16]:=
Click for copyable input
Out[16]=

使用 Grid 显示筛选后的数据:

In[17]:=
Click for copyable input
Out[17]=

前面各步仍需要一定的手动努力. 相反,您可以编写一个函数,基于其它各列的值对所有无效项进行替换. 然后该函数可用于处理数据集的各列.

下面的函数取一个数据集、一个有待处理的列数、一个有待分组的列数,以及一个函数作为其参数. 它对正处理的列中元素应用该函数,并用编组列中的值进行编组后的结果替代所有的非数值项:

In[18]:=
Click for copyable input

首先定义原始数据,忽略第4组的输入:

In[19]:=
Click for copyable input
Out[19]=

用相应的组均值替代第三列中的非数值项:

In[20]:=
Click for copyable input
Out[20]=

另外,也可以用相应的组中位数替代第三列中的非数值项:

In[21]:=
Click for copyable input
Out[21]=

然后,您可以用 Table 对数据集进行逐列处理. 将 Transpose 用于 Grid 以表格形式显示新清理后的结果. 该例用组均值作为替代值:

In[22]:=
Click for copyable input
Out[22]=

由于该函数用于在单列上进行操作,您可以对各列使用不同的估计值.

这里,各列的无效元素分别被所在列的组均值代替,第三列的无效元素被对应的组均值代替:

In[25]:=
Click for copyable input
Out[25]=