Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 从向量中删除NA值_R_Max_Min_Na_Missing Data - Fatal编程技术网

R 从向量中删除NA值

R 从向量中删除NA值,r,max,min,na,missing-data,R,Max,Min,Na,Missing Data,我有一个巨大的向量,它有两个NA值,我试图找到向量中的最大值(向量都是数字),但我不能这样做,因为NA值 如何删除NA值以便计算最大值?尝试?max,您将看到它实际上有一个NA.rm=参数,默认设置为FALSE。(这是许多其他R函数的常见默认值,包括sum(),mean(),等等。) 设置na.rm=TRUE正好满足您的要求: d <- c(1, 100, NA, 10) max(d, na.rm=TRUE) 最后一点注意:其他函数(例如table()、lm()、和sort())具有使用

我有一个巨大的向量,它有两个
NA
值,我试图找到向量中的最大值(向量都是数字),但我不能这样做,因为
NA


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

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

设置
na.rm=TRUE
正好满足您的要求:

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

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

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

?max
显示有一个额外的参数
na.rm
,可以设置为
TRUE

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

myvec[!is.na(myvec)]

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

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

vec以防万一,R新手想要对原始问题的简化答案

如何从向量中删除NA值

这是:

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

foo = c(1:10, NA, 20:30)
运行
length(foo)
22

nona_foo = foo[!is.na(foo)]
length(nona\u foo)
为21,因为NA值已被删除

请记住
is.na(foo)
返回一个布尔矩阵,因此使用与此值相反的
foo
索引将为您提供所有非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
>x na.省略(x)
一美元
[1] 1
b美元
[1] 2
$c
[1] NA

我运行了一个快速基准测试,比较了这两种
基本方法,结果发现
x[!is.na(x)]
na.omit
快。用户
qwr
建议我也尝试
purr::dicard
,这被证明是非常缓慢的(尽管我很乐意就我的实现和测试发表评论!)

以下是
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

我认为这是最好的。na.rm和na.omit在输出中添加了相当多的垃圾。除了
na.omit
还有一个数据帧方法,所以更一般。这是一个非常糟糕的主意。它失败了,并为所有NAs的
d
提供了
-Inf
。@user3932000为了让其他人清楚,你的抱怨实际上是关于基本R函数
max()
的行为(例如,当执行
max(c(NA,NA)
时).就个人而言,我认为它的行为是合理的;我希望它是以这种方式构建的,这样当你做
a@user3932000这样的事情时,你会得到预期的结果。有点切题,R作为数据分析平台的诸多优势之一是它对缺失数据的复杂处理,这是其作者非常仔细思考的结果ors。(如果您对这个主题感兴趣,可以从那些致力于将R-like
NA
-处理工具合并到Python优秀的NumPy包中的程序员的角度,对其中涉及的一些问题进行很好的讨论。)@ USSR332000:这个答案真的很糟糕吗?你认为NULL SET的最大值是什么?@ CliffAB没有最大值。∞ (及+∞), 但这并不总是理想的或直观的。而且,当你从
NA
s的向量中删除所有
NA
s时,你会期望一个空向量,而不是-∞.您应该尝试
purrr:discard
> x <- list(a=1, b=2, c=NA)
> na.omit(x)
$a
[1] 1

$b
[1] 2

$c
[1] NA
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
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