Answers:
尝试?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
导致您在函数调用中遇到问题,则值得检查函数参数中的内置解决方案。我发现通常已经有一个了。
max()
行为(例如,在执行时max(c(NA, NA)
)。我个人认为它的行为是合理的。我希望它是这样构造的,以便您在执行类似操作时可以得到预期的结果a <- c(NA, NA); b <- 1:4; max(c(max(a, na.rm = TRUE), max(b, na.rm = TRUE)))
NA
从s的向量中删除所有s 时NA
,您会期望得到一个空向量,而不是-∞。
?max
向您显示还有一个na.rm
可以设置为的参数TRUE
。
除此之外,如果您确实要删除NA
s,则使用类似以下内容的代码:
myvec[!is.na(myvec)]
na.omit
也有一个dataframe方法,所以比较通用。
discard
从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
我运行了一个比较两个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
-Inf
了d
所有的NAS。