2013-05-29 32 views
21

這裏處理是矢量R:與TRUE,FALSE,NA和NaN的

a = c(T,F,F,NA,F,T,NA,F,T) 

我想一個簡單的函數,返回TRUE每次存在a一個真假每次有一個假或在a的NA。

以下3事情不工作

a == T 
identical(T,a) 
isTRUE(a) 

這裏是一個解決方案

a[-which(is.na(a))] 

,但它似乎並沒有向前邁進一straigth和簡單的解決方案

有另一個解

這裏有一些功能(和運營商),我知道:

identical() 
isTRUE() 
is.na() 
na.rm() 
& 
| 
! 

什麼其他功能(運營商,技巧,什麼的,......)是有用的處理TRUE,FALSE, NA,NaN?

終於...

什麼是NA和NaN的區別?

除T,F,NA和NaN之外是否還有其他「邏輯事物」?

非常感謝!

+4

要回答你的第一個問題,這裏有一個方法:'Vectorize(isTRUE)(a)'。 –

+1

更狹隘,我認爲'!is.na(x)&x'應該工作,只要你期望的值肯定包含在{'TRUE','FALSE','NA','NaN'}中... –

+0

不錯的解決方案! –

回答

8

回答您的問題依次是:

1)==運營商確實沒有把NA的,你希望它。一個非常有用的功能是從r-cookbook.comcompareNA功能:

compareNA <- function(v1,v2) { 
    # This function returns TRUE wherever elements are the same, including NA's, 
    # and false everywhere else. 
    same <- (v1 == v2) | (is.na(v1) & is.na(v2)) 
    same[is.na(same)] <- FALSE 
    return(same) 
    } 

2)NA表示「不可用」,並且是不一樣的一般的NaN(「非數字」)。 NA通常用於數字的默認值以代替缺失的數據; NaN通常是由於數字問題(取-1或類似的日誌)而生成的。

3)我不太清楚「邏輯事物」的含義 - 許多不同的數據類型,包括數字向量,都可以用作邏輯運算符的輸入。您可能想嘗試閱讀R邏輯運算符頁面:http://stat.ethz.ch/R-manual/R-patched/library/base/html/Logic.html

希望這會有所幫助!

+0

0除以'Inf',但'Inf-Inf'給你'NaN'。如果產生了'NaN',例如'log(-1)',R函數會產生一個異常。 –

+0

@Matthew:謝謝 - 更正。 – ben

6

所以,你要真留真假保持FALSE,唯一真正的變化是,NA需要成爲FALSE,所以才這樣做的改變,如:

a[ is.na(a) ] <- FALSE 

或者你也可以另一種方式說出來是唯一真正的如果這是真的,而不是丟失:

a <- a & !is.na(a) 
6

以本Bolker的建議上面你可以設置以下的is.na自己的函數()語法

is.true <- function(x) { 
    !is.na(x) & x 
} 

a = c(T,F,F,NA,F,T,NA,F,T) 

is.true(a) 
[1] TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE 

這也適用於子集數據。

b = c(1:9) 
df <- as.data.frame(cbind(a,b)) 

df[is.true(df$a),] 

    a b 
1 1 1 
6 1 6 
9 1 9 

並有助於避免在數據中存在NA的情況下意外地合併空行。

df[df$a == TRUE,] 

     a b 
1  1 1 
NA NA NA 
6  1 6 
NA.1 NA NA 
9  1 9 
+0

你真的不需要這裏的'ifelse()' - 正如@ GregSnow的回答指出的那樣,'!is.na(x)&x'等價於 –

+0

@BenBolker - 謝謝,按照建議更正。 – JWilliman

37

你不需要的功能包東西 - 以下作品

a = c(T,F,NA) 

a %in% TRUE 

[1] TRUE FALSE FALSE 
+5

很好的解決方案。你可以在函數形式中使用它:''%in%'(aamc $ forgive,FALSE)'這對'apply'及其同類很有用。 –

4

我喜歡is.element功能:

is.element(a, T)