2011-07-06 28 views
3

試圖根據從SQL借用的數據框的子集獲取非空值。嘗試像這樣:檢查子集中的定義值()

lately <- subset(data, year > 1997 & myvalue != NA) 

但這是不對的。任何提示,r'sters?

+0

數據? 「不正確」的定義?我們不是讀心者。 –

回答

7
subset(data, year > 1997 & !is.na(myvalue)) 

應該這樣做。您的版本不起作用的原因是foo != NAfoo == NA始終是NA,因爲我們不知道NA數據是什麼。使用is.na()來測試NA,如果你想要「不是NA」,則使用!否定它。

例如爲:

> dat <- data.frame(year = 1995:2000, myvalue = c(1,3,4,NA,6,10)) 
> dat 
    year myvalue 
1 1995  1 
2 1996  3 
3 1997  4 
4 1998  NA 
5 1999  6 
6 2000  10 
> subset(dat, year > 1997 & myvalue != NA) 
[1] year myvalue 
<0 rows> (or 0-length row.names) 
> subset(dat, year > 1997 & !is.na(myvalue)) 
    year myvalue 
5 1999  6 
6 2000  10 

這是有益的,爲什麼您的版本不起作用進一步思考。

的子句返回的第一部分:

> with(dat, year > 1997) 
[1] FALSE FALSE FALSE TRUE TRUE TRUE 

對於我們並不需要做任何進一步的檢查,因爲它們是假的前3個元素,但我們需要檢查一下第二條條款的最後示例中有三個元素。第二子句返回NA所有元素,如以上所討論的:

> with(dat, myvalue != NA) 
[1] NA NA NA NA NA NA 

因此,合併的子句返回:

> with(dat, year > 1997 & myvalue != NA) 
[1] FALSE FALSE FALSE NA NA NA 

這將最終沒有選擇任何行,並且因此零行對象返回的爲你舉例。

+0

謝謝你的深思。 – Wells