我遵循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的向量,其中True
或False
取决于该条目是否为NA
。为什么"包装"这个带有x []的向量突然成为NA
自身的子集?
答案 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)]
成语如此重要的原因)