2011-06-27 138 views
5

我正在使用R,並且搜索了周圍的答案,但是當我看到類似的問題時,它不適用於我的具體問題。忽略NA的sapply函數

在我的數據集中,我嘗試使用NA作爲佔位符,因爲一旦我完成了部分分析,我將返回給它們,因此,我希望能夠將所有計算結果作爲如果NA的不在那裏。

下面是一個示例數據表

ROCA = c(1,3,6,2,1,NA,2,NA,1,NA,4,NA) 
ROCA <- data.frame (ROCA=ROCA)  # converting it just because that is the format of my original data 

#Now my function 
exceedes <- function (L=NULL, R=NULL, na.rm = T) 
{ 
    if (is.null(L) | is.null(R)) { 
     print ("mycols: invalid L,R.") 
     return (NULL)    
    } 
    test <-(mean(L, na.rm=TRUE)-R*sd(L,na.rm=TRUE)) 
    test1 <- sapply(L,function(x) if((x)> test){1} else {0}) 
    return (test1) 
} 
L=ROCA[,1] 
R=.5 
ROCA$newcolumn <- exceedes(L,R) 
names(ROCA)[names(ROCA)=="newcolumn"]="Exceedes1" 

我收到錯誤我的問題:

Error in if ((x) > test) { : missing value where TRUE/FALSE needed 

正如你們知道,這是有點問題sapply功能。任何想法如何忽略這些NA的?我會嘗試na.omit,如果我能把它插入所有NA的權利,但我不知道如何做到這一點。

+0

爲什麼不只是將另一個if語句添加到sapply函數中,如果x是NA,則返回NA?另外,如果您將'browser()'放在函數中的任何位置,那麼當您下次運行它時,它將在該位置暫停。 –

+0

感謝您的迴應!我不確定我是否做到了這一點,但是我仍然得到同樣的錯誤。這裏是我的代碼test1 < - sapply(L,function(x)if((x)== NA){NA} else if((x)> test){1} else {0} )現在:if((x)== NA)錯誤{:缺少值,其中TRUE/FALSE required – Tim

+0

您必須使用'is.na(x)'來檢查它。 'x == NA'會返回NA ... – Tommy

回答

3

這種說法是奇怪:

test1 <- sapply(L,function(x) if((x)> test){1} else {0}) 

嘗試:

test1 <- ifelse(is.na(L), NA, ifelse(L > test, 1, 0)) 
+0

不能感謝你們倆。真的很感謝快速反饋! – Tim

+0

我不確定在這裏再次詢問一個單獨但相關的問題是否合適。感謝大家的幫助,我想做一個小小的調整。我的數據的某些部分有空白,我想指定如果兩列各有空白,則第5至10列的值將爲NA。我試圖使用的代碼是這樣的。我當然需要檢查我的if語句。 a < - if(a [,10]&a [,11] ==「」is.na(a [,5:10])我得到Error:a < - if(a [,10]&a [,11] ==「」is.na「 – Tim

+0

'if'是一個控制結構。你可能想'ifelse'返回一個向量。 –

2

你想NA:■在結果?也就是說,你想要排隊嗎?

好像只是返回L > test會工作。添加列也可以簡化(我懷疑「Exeedes1」在某個變量中)。

exceedes <- function (L=NULL, R=NULL, na.rm = T) 
{ 
    if (is.null(L) | is.null(R)) { 
     print ("mycols: invalid L,R.") 
     return (NULL)    
    } 
    test <-(mean(L, na.rm=TRUE)-R*sd(L,na.rm=TRUE)) 

    L > test 
} 
L=ROCA[,1] 
R=.5 
ROCA[["Exceedes1"]] <- exceedes(L,R) 
5

沒有必要爲sapply和您的匿名功能,因爲>已經被量化。

指定無效的默認參數值似乎也很奇怪。我的猜測是,你使用它作爲一個kludge而不是使用missing函數。拋出一個錯誤,而不是返回NULL也是一個好習慣,因爲當函數返回NULL時,您仍然需要嘗試捕獲它。

exceedes <- function (L, R, na.rm=TRUE) 
{ 
    if(missing(L) || missing(R)) { 
    stop("L and R must be provided") 
    } 
    test <- mean(L,na.rm=TRUE)-R*sd(L,na.rm=TRUE) 
    as.numeric(L > test) 
} 

ROCA <- data.frame(ROCA=c(1,3,6,2,1,NA,2,NA,1,NA,4,NA)) 
ROCA$Exceeds1 <- exceedes(ROCA[,1],0.5) 
+0

使用null的好處是,顯式傳入總是很容易。在某些情況下,生成「缺失」參數是一種痛苦。 – hadley

+0

@hadley:我同意(這是'plot.default'如何處理幾個參數),但是我指的是'NULL'參數值無效的特定情況。 –