5

我正在使用 R 并四处寻找答案,但是虽然我看到了类似的问题,但它并没有解决我的具体问题。

在我的数据集中,我尝试使用NA's 作为占位符,因为一旦完成部分分析,我将返回它们,因此,我希望能够像NA's一样进行所有计算真的不在那里。

这是我对示例数据表的问题

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,但我不知道该怎么做。

4

3 回答 3

5

不需要sapply你的匿名函数,因为>已经矢量化了。

指定无效的默认参数值似乎也很奇怪。我的猜测是您将其用作杂物而不是使用该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)
于 2011-06-28T00:42:21.143 回答
3

这个说法很奇怪:

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

尝试:

test1 <- ifelse(is.na(L), NA, ifelse(L > test, 1, 0))
于 2011-06-27T23:30:07.123 回答
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)
于 2011-06-27T23:55:58.043 回答