2016-09-22 93 views
3

爲什麼complete.casesanyNA都不會爲第1行返回FALSE?根據他們的文檔,似乎他們應該......我閱讀文檔錯誤嗎?complete.cases和anyNA在行中不檢測NA?

csv<-data.frame(c(100,50,100),c(1,1,1),c(NA,12,NA)) 
csv$complete<-apply(csv,1,function(x){x[1]==100 && x[2]==1 && complete.cases(x)}) #check that column_1==100, and column_2=1, and no missing values in the row 

csv$complete2<-apply(csv,1,function(x){x[1]==100 && x[2]==1 && anyNA(x, recursive = FALSE)}) 

> csv 
c.100..50..100. c.1..1..1. c.NA..12..NA. complete complete2 
1    100   1   NA  TRUE  TRUE 
2    50   1   12 FALSE  FALSE 
3    100   1   NA  TRUE  TRUE 
+1

你可以考慮這個。 TRUE && complete.cases(c(1,2,NA))'這是'TURE && c(TRUE,TRUE,FALSE)'並返回'TRUE'。我猜只有在使用'&&'時纔會使用第一個TRUE,您可以在函數中嘗試使用'&'。 – Psidom

+0

'anyNA'似乎按照您的預期工作(如果至少有一個NA和FALSE,則爲TRUE)。如@Psidom所示,'complete.cases'爲行的每個元素返回一個具有單獨真值的向量。 'isTRUE(c(TRUE,TRUE,FALSE))'返回'FALSE',所以@Psidom可能是正確的,R只查看那個向量的第一個值。實際上,如果切換第1列和第3列,則第一次邏輯測試會返回「FALSE FALSE FALSE」,這也表明僅使用由'complete.cases'返回的矢量的第一個元素。 – eipi10

+0

有趣的是,爲什麼不用'!isTRUE(anyNA(x,recursive = FALSE))替換'anyNA()'給出正確的結果?我只是用'isTRUE(anyNA(c(1,2,NA)))'來測試它,並且如預期的那樣它返回TRUE – Rilcon42

回答

3

第一個明顯的異常對您的眼睛表示不理解&&&之間的差異。匿名函數被賦予了3元向量與complete.cases返回此第一行:

complete.cases(c(100,1,NA)) 
[1] TRUE TRUE FALSE 

&&功能只提供給它的每一個向量的第一項交易,所以它的第一行返回TRUE 。可以說這裏的警告可能是適當的。如果你曾經想要的東西,對於一個缺乏NA的測試,它恰好是在考慮一個載體,我會用all(!is.na(.))

csv$complete<-apply(csv,1,function(x){x[1]==100 && x[2]==1 && all(!is.na((x)) )}) 

csv$complete2<-apply(csv,1,function(x){x[1]==100 && x[2]==1 && anyNA(x, recursive = FALSE)}) 

> csv 
    c.100..50..100. c.1..1..1. c.NA..12..NA. complete complete2 
1    100   1   NA FALSE  TRUE 
2    50   1   12 FALSE  FALSE 
3    100   1   NA FALSE  TRUE 

的anyNA應該被否定以‘!’如果(從上下文來看),您預計complete2的所有內容也都是FALSE。