2015-10-17 46 views
-1

我正在關注的swirl教程,和部分中的一個具有向量x定義爲:x [is.na(x)]在R中做什麼?

> 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的本身?

+2

當您通過邏輯向量爲向量編制索引時,向量的索引爲「TRUE」的元素。你可以自己玩這個遊戲 - 做'x < - c(1,2,3)',然後做例如'x [c(T,F,T)]','x [c(F,F ,F)]'等。 – josliber

+0

'[]'操作符選擇'x'的子集。例如,'x [1:4]'返回'x'的前四個元素。當傳遞一個邏輯向量時,它將返回所有向量爲「TRUE」的'x'的元素。所以'x [is.na(x)]'返回''''''NA'的所有元素。相反,'x [!is.na(x)]'會返回'x'的所有非''''元素。 –

回答

2

這叫做邏輯索引。這是一個非常普遍和整潔的R習語。

是的,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)]成語如此重要)