x [is.na(x)]在R中做了什么?

时间:2015-10-17 00:37:18

标签: r vector indexing idiomatic

我遵循swirl教程,其中一个部分的向量x定义为:

> x
 [1]  1.91177824  0.93941777 -0.72325856  0.26998371          NA          NA
 [7] -0.17709161          NA          NA  1.98079386 -1.97167684 -0.32590760
[13]  0.23359408 -0.19229380          NA          NA  1.21102697          NA
[19]  0.78323515          NA  0.07512655          NA  0.39457671  0.64705874
[25]          NA  0.70421548 -0.59875008          NA  1.75842059          NA
[31]          NA          NA          NA          NA          NA          NA
[37] -0.74265585          NA -0.57353603          NA

然后,当我们输入x[is.na(x)]时,我们会得到所有NA的矢量

> x[is.na(x)]
 [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA

为什么会这样?我的困惑是is.na(x)本身在向量的每个条目中返回长度为40的向量,其中TrueFalse取决于该条目是否为NA。为什么"包装"这个带有x []的向量突然成为NA自身的子集?

1 个答案:

答案 0 :(得分:2)

这称为逻辑索引。这是一个非常普通和简洁的习语。

是的,is.na(x)给出一个与向量长度相同的布尔(“逻辑”)向量。

使用该逻辑向量进行索引称为逻辑索引

显然x[is.na(x)]返回x中所有NA条目的向量,除非你打算将它们重新分配给某些东西,否则它们完全没有意义。估算中位数(或其他任何东西)

 x[is.na(x)] <- median(x, na.rm=T)

(而x[!is.na(x)]更有趣的是返回x中的所有非NA条目。或者也比较na.omit(x)函数,这更加笨重.R的内置函数的方式做得更好(或不)处理NAs(默认情况下或可自定义)是拼凑而成的混乱,这就是x[is.na(x)]成语如此重要的原因)