正如您对用于数据分析的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中是否有类似的功能?
答案 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
包具有数据插补例程。另请参阅Amelia
,cat
(对于分类缺失估算),mi
,mitools
,VIM
,vmv
(用于缺失数据可视化)。
老实说,我仍然不太明白你的统计数据问题,或者关于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()
开头,但您可以设置它。