从向量中删除 NA 值

Remove NA values from a vector

提问人:CodeGuy 提问时间:10/10/2011 最后编辑:M--CodeGuy 更新时间:10/24/2023 访问量:604856

问:

我有一个巨大的向量,它有几个值,我试图找到该向量中的最大值(向量都是数字),但由于这些值,我无法做到这一点。NANA

如何删除这些值以便计算最大值?NA

na r-faq

评论


答:

316赞 Josh O'Brien 10/10/2011 #1

尝试 ,您会看到它实际上有一个参数,默认设置为 。(这是许多其他 R 函数的常见默认值,包括 、 等)?maxna.rm =FALSEsum()mean()

设置正是您所要求的:na.rm=TRUE

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

如果您确实想删除所有 s,请改用以下习语:NA

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

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

评论

1赞 user3932000 8/2/2019
这是一个非常糟糕的主意。它失败并给出所有 NA 中的一个。-Infd
0赞 Josh O'Brien 8/3/2019
@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)))
1赞 Josh O'Brien 8/3/2019
@user3932000 在某种程度上,R 作为数据分析平台的众多优势之一是它对缺失数据的复杂处理,这是其作者经过深思熟虑的结果。(如果你对这个主题感兴趣,请参阅此处,从程序员的角度对所涉及的一些问题进行了很好的讨论,这些程序员参与了在 Python 出色的 NumPy 包中加入类似 R 的处理工具。NA
0赞 Cliff AB 1/30/2020
@user3932000:这个答案真的很糟糕吗?您认为 null 集的最大值是多少?
1赞 Cliff AB 1/30/2020
@user3932000:我想人们可能会认为他们想要什么,但对我来说,这是一个非常数学一致的答案max(NULL)-Inf
16赞 Michael Hoffman 10/10/2011 #2

您可以调用 .更一般地说,您可以使用该函数。max(vector, na.rm = TRUE)na.omit()

27赞 Nick Sabbe 10/10/2011 #3

?max显示有一个额外的参数可以设置为 。na.rmTRUE

除此之外,如果您真的想删除 s,只需使用如下内容:NA

myvec[!is.na(myvec)]

评论

3赞 MadmanLee 9/12/2017
我认为这是最好的。na.rm 和 na.omit 在输出中添加了相当多的垃圾。
1赞 IRTFM 2/26/2019
除了还有一个 DataFrame 方法,所以更通用。na.omit
113赞 IRTFM 10/10/2011 #4

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

vec <- 1:1000
vec[runif(200, 1, 1000)] <- NA
max(vec)
#[1] NA
max( na.omit(vec) )
#[1] 1000
19赞 Scott C Wilson 1/18/2015 #5

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

如何从向量中删除 NA 值?

在这里:

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

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

跑步给 22。length(foo)

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

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

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

48赞 qwr 7/27/2019 #6

使用 discard from purrr(适用于列表和向量)。

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
6赞 jsavn 3/9/2020 #7

我运行了一个比较这两种方法的快速基准测试,结果证明它比 .用户建议我也尝试一下 - 结果证明这要慢得多(尽管我很乐意对我的实现和测试发表评论!basex[!is.na(x)]na.omitqwrpurrr::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

作为参考,以下是 vs 的原始测试:x[!is.na(x)]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

评论

0赞 qwr 6/16/2020
你应该试试purrr:discard
1赞 Quinten 8/27/2022 #8

另一个选项使用如下:complete.cases

d <- c(1, 100, NA, 10)
result <- complete.cases(d)
output <- d[result]
output
#> [1]   1 100  10
max(output)
#> [1] 100

创建于 2022-08-26 with reprex v2.0.2