我有一个巨大的向量,它有几个NA值,我试图找到这个向量中的最大值(向量都是数字),但我不能这样做,因为NA值。如何删除NA值以便计算max?
NA
h9a6wy2h1#
尝试?max,您将看到它实际上有一个na.rm =参数,默认设置为FALSE。(这是许多其他R函数的常见默认值,包括sum(),mean()等)设置na.rm=TRUE可以满足您的要求:
?max
na.rm =
FALSE
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在函数调用中导致问题,那么值得检查函数参数中的内置解决方案。我发现那里已经有一个了。
table()
lm()
sort()
1rhkuytd2#
na.omit函数是许多回归例程在内部使用的:
na.omit
vec <- 1:1000 vec[runif(200, 1, 1000)] <- NA max(vec) #[1] NA max( na.omit(vec) ) #[1] 1000
l7mqbcuq3#
使用discard from purrr(适用于列表和向量)。
discard
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
yv5phkfx4#
?max向您展示了一个额外的参数na.rm,您可以将其设置为TRUE。除此之外,如果你真的想删除NA s,只需使用如下代码:
na.rm
TRUE
myvec[!is.na(myvec)]
sdnqo3pr5#
只是为了以防R的新手想要一个简化的答案来回答原来的问题如何从向量中删除NA值?这就是:假设你有一个向量foo如下:
foo
foo = c(1:10, NA, 20:30)
运行length(foo)得到22。
length(foo)
nona_foo = foo[!is.na(foo)]
length(nona_foo)是21,因为NA值已被删除。记住is.na(foo)返回一个布尔矩阵,所以用这个值的相反值索引foo将给予所有不为NA的元素。
length(nona_foo)
is.na(foo)
b91juud36#
您可以调用max(vector, na.rm = TRUE)。更一般地,您可以使用na.omit()函数。
max(vector, na.rm = TRUE)
na.omit()
wfveoks07#
我运行了一个快速基准测试,比较了两种base方法,结果表明x[!is.na(x)]比na.omit快。用户qwr建议我也试试purrr::dicard--结果慢了很多(尽管我很乐意接受对我的实现和测试的评论!))
base
x[!is.na(x)]
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)]与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
gdx19jrr8#
另一个使用complete.cases的选项如下所示:
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附带reprex v2.0.2
8条答案
按热度按时间h9a6wy2h1#
尝试
?max
,您将看到它实际上有一个na.rm =
参数,默认设置为FALSE
。(这是许多其他R函数的常见默认值,包括sum()
,mean()
等)设置
na.rm=TRUE
可以满足您的要求:如果你想删除所有的
NA
,可以使用下面的习惯用法:最后一点:其他功能(如
table()
、lm()
和sort()
)具有与NA
相关的参数,这些参数使用不同的名称(并提供不同的选项)。因此,如果NA
在函数调用中导致问题,那么值得检查函数参数中的内置解决方案。我发现那里已经有一个了。1rhkuytd2#
na.omit
函数是许多回归例程在内部使用的:l7mqbcuq3#
使用
discard
from purrr(适用于列表和向量)。好处是方便使用管道;或者使用内置的子集函数
[
:请注意,
na.omit
不适用于列表:yv5phkfx4#
?max
向您展示了一个额外的参数na.rm
,您可以将其设置为TRUE
。除此之外,如果你真的想删除
NA
s,只需使用如下代码:sdnqo3pr5#
只是为了以防R的新手想要一个简化的答案来回答原来的问题
如何从向量中删除NA值?
这就是:
假设你有一个向量
foo
如下:运行
length(foo)
得到22。length(nona_foo)
是21,因为NA值已被删除。记住
is.na(foo)
返回一个布尔矩阵,所以用这个值的相反值索引foo
将给予所有不为NA的元素。b91juud36#
您可以调用
max(vector, na.rm = TRUE)
。更一般地,您可以使用na.omit()
函数。wfveoks07#
我运行了一个快速基准测试,比较了两种
base
方法,结果表明x[!is.na(x)]
比na.omit
快。用户qwr
建议我也试试purrr::dicard
--结果慢了很多(尽管我很乐意接受对我的实现和测试的评论!))作为参考,下面是
x[!is.na(x)]
与na.omit
的原始测试:gdx19jrr8#
另一个使用
complete.cases
的选项如下所示:创建于2022-08-26附带reprex v2.0.2