2010-04-10 50 views
26

正如你对针对数据分析DSL期待,R处理缺少/不完整的数据非常好,比如:在R中处理丢失/不完整的数据 - 是否有掩盖但不移除NAs的功能?

许多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) 

但是如果你想前处理的NA 函数调用,你需要做的是这样的:

从矢量中删除每个“NA”:

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

从向量删除的每个“NA”和替换它瓦特/“0”:

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

以去除整个各行包含“NA”从数据帧:

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

所有这些功能永久除去“NA”或行与他们的“NA”。

有时候这并不完全符合你的想法 - 使工作流中的下一步需要数据框的'NA'删除副本,但在后续步骤中,您经常需要这些行返回(例如,为先前调用'complete cases'但该列中没有'NA'值导致缺少行的列计算列逐列统计量。

尽可能什么我要找的是明确的:蟒蛇/ numpy的有一个类,屏蔽数组,具有面具方法,它可以让你隐瞒 - 但不是remove--在函数调用期间的NA。 R中有类似的功能吗?

回答

18

究竟如何处理丢失的数据 - 如果我们知道丢失数据可能会被标记为NA - 可能会因域而异。

采取相关的时间序列,在那里你可以跳过或填充物,或插或内插不同的一个例子,是...... 只是(非常有用和流行)zoo拥有所有这些功能有关NA处理:

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

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

另一个例子是CRAN上大量缺失的插补软件包 - 通常提供特定于领域的解决方案。 [所以,如果你打电话给DSL,这是什么? “域特定语言的子域特定解决方案”还是SDSSFDSL?相当一口:) :)

但是对于你的具体问题:不,我不知道基准R中的一个位级标志,允许你将观察结果标记为'被排除'。我认为大多数R用户会诉诸如na.omit()等功能或使用您提到的na.rm=TRUE选项。

+1

您到动物园的链接已损坏。 [Here](http://cran.r-project.org/web/packages/zoo/zoo.pdf)是我能找到的最新文档(.pdf警告)的链接,[Here](http:/ /cran.r-project.org/web/packages/zoo/index.html)是我认为是动物园最新总结的链接。 – deadstump 2012-11-02 14:40:12

+1

URL中的错误复数'',因为它是'package = ...',而不是'packages = ...'。现在修好了,谢谢。 – 2012-11-02 14:50:36

15

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

第3章中“交互式动态图形数据分析师R和GGobi”迪库克德博拉Swayne是关于这个话题很好的参考。

在本章中您将看到norm包,但Hmisc包有数据插补例程。另见Amelia,cat(用于分类缺失插补),mi,mitools,VIM,vmv(用于缺失数据可视化)。

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

这是一个优化问题...没有明确的答案,你应该决定什么/你为什么坚持一些方法。但是查看数据总是很好的做法! =) 一定要检查库克& Swayne - 这是一个优秀的,精湛的书面指南。 “带R的线性模型”作者:远景也包含有关缺失值的章节。

所以那里。

祝你好运! =)

8

函数na.exclude()听起来像你想要的,尽管它只是一些(重要的)函数的一个选项。

在装配和处理模型的情况下,R设有负责来港家庭的通用功能:na.fail()na.pass()na.omit(),并na.exclude()。这些依次是R的一些关键建模函数的参数,如lm(),glm()nls()以及MASS,rpart和生存包中的函数。

所有四个通用函数基本上起到了过滤器的作用。如果没有NAs,na.fail()将只传递数据,否则失败。 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(),但是你可以设置它。