忽略NA的功能

时间:2011-06-27 22:58:33

标签: function r sapply

我正在使用R并且已经寻找答案但是虽然我看到了类似的问题,但它并没有针对我的具体问题。

在我的数据集中,我试图使用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 

正如大家都知道的那样,它的功能是错误的。关于如何忽略NA的任何想法?我会尝试na.omit如果我可以让它将所有NA插入到他们之前的位置,但我不知道该怎么做。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:3)

这句话很奇怪:

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

尝试:

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

答案 2 :(得分:2)

你想在结果中找到NA:s吗?也就是说,您希望行排成一行吗?

似乎只是返回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)