27

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

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

>>> 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”切除副本对于工作流的下一步可能是必要的,但在后续步骤中,您通常希望这些行返回(例如,计算因先前调用“完整案例”而导致缺少行但该列中没有“NA”值的列的按列统计)。

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

4

3 回答 3

19

丢失数据的确切处理方法——可能被标记为NA好像我们知道它丢失了——可能因域而异。

举一个与时间序列相关的例子,您可能想要跳过、填充、插值或插值不同的地方,......仅仅是(非常有用和流行的)动物园具有所有这些与NA处理相关的功能:

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

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

另一个例子是 CRAN 上大量缺失的插补包——通常提供特定领域的解决方案。[所以如果你称 R 为 DSL,这是什么?“特定领域语言的子领域特定解决方案”或 SDSSFDSL?好满口:)]

但是对于您的具体问题:不,我不知道基础 R 中的位级标志允许您将观察结果标记为“被排除”。我想大多数 R 用户会求助于na.omit()et al 之类的功能或使用na.rm=TRUE您提到的选项。

于 2010-04-10T15:11:30.647 回答
15

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

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

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

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

这是一个优化问题......没有明确的答案,您应该决定什么/为什么要坚持某种方法。但查看数据始终是一个好习惯!=) 一定要查看 Cook & Swayne - 这是一本出色的、熟练的书面指南。Faraway“Linear Models with R”还包含有关缺失值的一章。

所以在那里。

祝你好运!=)

于 2010-06-08T03:03:10.670 回答
8

该功能na.exclude()听起来像您想要的,尽管它只是某些(重要)功能的一个选项。

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

所有四个通用函数基本上都充当过滤器。 na.fail()只有在没有 NA 的情况下才会通过数据,否则会失败。na.pass()通过所有案件。 na.omit()并且na.exclude()都将忽略带有 NA 的案例并通过其他案例。但是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")as 确定并开始于,na.omit()但您可以设置它。

于 2014-05-13T18:25:01.740 回答