从向量中删除NA值


191

我有一个巨大的向量,它具有几个NA值,并且我试图在该向量中找到最大值(向量是所有数字),但是由于这些NA值,我无法执行此操作。

如何删除NA值,以便可以计算最大值?

Answers:


264

尝试?max一下,您会看到它实际上有一个na.rm =参数,默认情况下设置为FALSE。(这是许多其他R函数(包括sum()mean()等)

设置na.rm=TRUE可以满足您的要求:

d <- c(1, 100, NA, 10)
max(d, na.rm=TRUE)

如果确实要删除所有NA,请改用以下惯用法:

d <- d[!is.na(d)]

最后一点:其他函数(例如table()lm()sort())具有NA使用不同名称的相关参数(并提供不同选项)。因此,如果NA导致您在函数调用中遇到问题,则值得检查函数参数中的内置解决方案。我发现通常已经有一个了。


这是一个非常糟糕的主意。它失败,并给出-Infd所有的NAS。
user3932000 '19

@ user3932000为了让其他人清楚,您的抱怨实际上是关于基本R函数的max()行为(例如,在执行时max(c(NA, NA))。我个人认为它的行为是合理的。我希望它是这样构造的,以便您在执行类似操作时可以得到预期的结果a <- c(NA, NA); b <- 1:4; max(c(max(a, na.rm = TRUE), max(b, na.rm = TRUE)))
Josh O'Brien

@ user3932000有点相切,R的许多优势作为数据分析平台之一,是其成熟的处理缺失数据,结果很多关于它的作者的部分认真思考。(如果您对此主题感兴趣,从参与将类似R的处理功能集成NA到Python出色的NumPy软件包中的程序员的角度,在此处对所涉及的一些问题进行深入讨论。)
Josh奥布莱恩

@ user3932000:这个答案真的不好吗?您认为空集的最大值是什么?
Cliff AB

@CliffAB没有最大值。您可以将最大值指定为-∞(而将最小值指定为+∞),但这并不总是理想或直观的。同样,当NA从s的向量中删除所有s 时NA,您会期望得到一个空向量,而不是-∞。
user3932000

94

na.omit函数是内部许多回归例程使用的函数:

vec <- 1:1000
vec[runif(200, 1, 1000)] <- NA
max(vec)
#[1] NA
max( na.omit(vec) )
#[1] 1000

20

?max向您显示还有一个na.rm可以设置为的参数TRUE

除此之外,如果您确实要删除NAs,则使用类似以下内容的代码:

myvec[!is.na(myvec)]

3
我认为这是最好的。na.rm和na.omit给输出增加了很多垃圾。
MadmanLee17年

除了na.omit也有一个dataframe方法,所以比较通用。
IRTFM '19


14

以防万一刚接触R的人想要简化对原始问题的回答

如何从向量中删除NA值?

这里是:

假设您有一个向量foo,如下所示:

foo = c(1:10, NA, 20:30)

运行length(foo)给出22。

nona_foo = foo[!is.na(foo)]

length(nona_foo) 为21,因为NA值已被删除。

请记住会is.na(foo)返回一个布尔矩阵,因此foo使用与此值相反的索引将为您提供所有非NA元素。


13

discardpurrr使用(适用于列表和向量)。

discard(v, is.na) 

好处是易于使用管道。或者使用内置的子设置功能[

v %>% discard(is.na)
v %>% `[`(!is.na(.))

请注意,这na.omit不适用于列表:

> x <- list(a=1, b=2, c=NA)
> na.omit(x)
$a
[1] 1

$b
[1] 2

$c
[1] NA

1

我运行了一个比较两个base方法的快速基准测试,事实证明,该x[!is.na(x)]方法比na.omit。用户qwr建议我purrr::dicard也尝试-事实证明这要慢得多(尽管我会很乐意对实施和测试发表评论!)

microbenchmark::microbenchmark(
  purrr::map(airquality,function(x) {x[!is.na(x)]}), 
  purrr::map(airquality,na.omit),
  purrr::map(airquality, ~purrr::discard(.x, .p = is.na)),
  times = 1e6)

Unit: microseconds
                                                     expr    min     lq      mean median      uq       max neval cld
 purrr::map(airquality, function(x) {     x[!is.na(x)] })   66.8   75.9  130.5643   86.2  131.80  541125.5 1e+06 a  
                          purrr::map(airquality, na.omit)   95.7  107.4  185.5108  129.3  190.50  534795.5 1e+06  b 
  purrr::map(airquality, ~purrr::discard(.x, .p = is.na)) 3391.7 3648.6 5615.8965 4079.7 6486.45 1121975.4 1e+06   c

供参考,这是x[!is.na(x)]vs 的原始测试na.omit

microbenchmark::microbenchmark(
    purrr::map(airquality,function(x) {x[!is.na(x)]}), 
    purrr::map(airquality,na.omit), 
    times = 1000000)


Unit: microseconds
                                              expr  min   lq      mean median    uq      max neval cld
 map(airquality, function(x) {     x[!is.na(x)] }) 53.0 56.6  86.48231   58.1  64.8 414195.2 1e+06  a 
                          map(airquality, na.omit) 85.3 90.4 134.49964   92.5 104.9 348352.8 1e+06   b

您应该尝试purrr:discard
qwr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.