处理R中缺失/不完整的数据是否有掩盖但不删除NA的功能?

时间:2010-04-10 12:52:47

标签: r missing-data data-processing

正如您对用于数据分析的DSL所期望的那样,R可以很好地处理缺失/不完整的数据,例如:

许多R函数都有一个 na.rm 标志,当设置为 TRUE 时,删除NAs:

>>> v = mean( c(5, NA, 6, 12, NA, 87, 9, NA, 43, 67), na.rm=T)
>>> v
      (5, 6, 12, 87, 9, 43, 67)

但如果您想在函数调用之前处理NAs ,则需要执行以下操作:

从矢量中删除每个'NA':

vx = vx[!is.na(a)]

从矢量中删除每个“NA”并将其替换为“0”:

ifelse(is.na(vx), 0, vx)

从数据框中删除包含“NA”的每一行:

dfx = dfx[complete.cases(dfx),]

所有这些功能永久删除'NA'或其中包含'NA'的行。

有时候这并不是你想要的 - 在工作流程的下一步可能需要制作一个“NA”切除的数据框副本,但在后续步骤中你经常需要这些行(例如,计算由先前调用“完整案例”而导致缺少行的列的逐列统计信息,但该列中没有“NA”值。

尽可能清楚我正在寻找的东西:python / numpy有一个类,蒙面数组,带有掩码方法,它可以让你隐藏 - 但不删除 - 函数调用期间的NAs。 R中是否有类似的功能?

3 个答案:

答案 0 :(得分:19)

如果我们知道遗失的数据可能被标记为NA,那么错误的数据可能会因域名而异。

举一个与时间序列相关的例子,你可能想要跳过,填充,插值,或插入不同的...,是只是(非常有用和受欢迎){ {3}}具有与NA处理相关的所有这些功能:

zoo::na.approx  zoo::na.locf    
zoo::na.spline  zoo::na.trim    

允许近似(使用不同的算法),前进或后退,使用样条插值或修剪。

另一个例子是CRAN上众多缺失的归集包 - 通常提供特定于域的解决方案。 [所以如果你把R称为DSL,这是什么? “针对特定领域语言的子域特定解决方案”或SDSSFDSL?相当满口:)]

但是对于你的具体问题:不,我不知道基数R中的位级标志,它允许你将观察标记为“被排除”。我认为大多数R用户会使用na.omit()等函数或使用您提到的na.rm=TRUE选项。

答案 1 :(得分:15)

查看数据是一个很好的做法,因此推断出缺失值的类型:是MCAR(缺失完整和随机),MAR(随机丢失)还是MNAR(缺失不随机)?基于这三种类型,您可以研究缺失值的基本结构,并得出归责是否完全适用(如果不是MNAR,那么你很幸运,因为在这种情况下,缺失的值被认为是不可忽略的,并且是与一些未知的潜在影响,因素,过程,变量......等等有关。

第二章 “使用R和GGobi进行数据分析师的交互式动态图形” Di Cook Deborah Swayne 是关于这个主题的很好的参考。

您将在本章中看到norm包的运行情况,但Hmisc包具有数据插补例程。另请参阅Ameliacat(对于分类缺失估算),mimitoolsVIMvmv(用于缺失数据可视化)。

老实说,我仍然不太明白你的统计数据问题,或者关于R缺失数据插补能力的问题?我认为我在第二个方面提供了很好的参考,关于第一个:你可以用集中趋势(平均值,中位数或类似值)替换你的NA,从而减少变异性,或随机常数“拉出”观察(记录)案例,或者您可以使用包含NA作为标准的变量进行回归分析,将其他变量用作预测变量,然后将残差分配给NA ...这是处理NA的优雅方式,但通常不会在你的CPU上轻松一点(我在1.1GHz上有Celeron,所以我必须要温和)。

这是一个优化问题......没有明确的答案,你应该决定什么/为什么你坚持使用某种方法。但是查看数据总是好的做法! =) 务必查看Cook& Swayne - 这是一本出色的,写得很好的指南。 “带有R的线性模型 Faraway 还包含有关缺失值的章节。

所以那里。

祝你好运! =)

答案 2 :(得分:8)

函数na.exclude()听起来像你想要的,虽然它只是某些(重要)函数的选项。

在拟合和使用模型的上下文中,R有一系列用于处理NA的通用函数:na.fail()na.pass()na.omit()na.exclude()。反过来,这些是R的一些关键建模函数的参数,例如lm()glm()nls()以及MASS,rpart和survival包中的函数。

所有四个通用函数基本上都充当过滤器。 na.fail()只会在没有NA的情况下传递数据,否则会失败。 na.pass()通过了所有案件。 na.omit()na.exclude()都会遗漏具有NAs的案件并通过其他案件。但是na.exclude()有一个不同的属性,它告诉处理结果对象的函数考虑到NA。如果您执行attributes(na.exclude(some_data_frame)),则可以看到此属性。以下是na.exclude()如何在线性模型的上下文中改变predict()的行为的演示。

fakedata <- data.frame(x = c(1, 2, 3, 4), y = c(0, 10, NA, 40))

## We can tell the modeling function how to handle the NAs
r_omitted <- lm(x~y, na.action="na.omit", data=fakedata) 
r_excluded <- lm(x~y, na.action="na.exclude", data=fakedata)

predict(r_omitted)
#        1        2        4 
# 1.115385 1.846154 4.038462 
predict(r_excluded)
#        1        2        3        4 
# 1.115385 1.846154       NA 4.038462 

顺便提一下,您的默认na.action由options("na.action")确定,并以na.omit()开头,但您可以设置它。