Function 忽略NA';sapply函数中的s

Function 忽略NA';sapply函数中的s,function,r,sapply,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

我正在使用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"

大家都知道,sapply函数有点问题。有没有关于如何忽略那些
NA
的想法?如果我能让它把所有的
na
插入到它们之前所在的位置,我会尝试
na。省略
,但我不知道怎么做。

这句话很奇怪:

test1 <- sapply(L,function(x) if((x)> test){1} else {0})
test1测试){1}其他{0})
尝试:

test1测试,1,0))

是否希望结果中包含NA:s?也就是说,您希望行对齐吗

似乎只要返回
L>测试就可以了。添加列也可以简化(我怀疑“exeeds1”在某个变量中)


超出了不需要
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)

超出了为什么不在sapply函数中添加另一条if语句,该函数在x为NA时返回NA?另外,如果您将
browser()
放在函数中的任何位置,下次运行时它将在该位置暂停。感谢您的回复!然而,我不确定我是否做对了,因为我仍然得到同样的错误。下面是我的代码test1 test){1}else{0}),错误现在是:if((x)==NA){:缺少需要TRUE/FALSE的值您必须使用
is.NA(x)
检查它。
x==NA
返回NA…非常感谢你们两位。非常感谢你们的快速反馈!我不确定在这里再问一个单独但相关的问题是否合适。感谢大家的帮助,我想做一个小的调整。我的数据的某些部分有空格,我想指定如果每个列有两个空格如果有空格,则第5列到第10列的值将为NA。我尝试使用的代码是这样的。我肯定需要检查我的if语句。“if”是一个控制结构。您可能需要返回向量的“ifelse”。我想您需要类似于
a[a[,10]==”&a[,11]==”,5:10]使用null的优点是它总是很容易显式传入。在某些情况下,生成“缺少”参数是一件痛苦的事情。@hadley:我同意(这就是
plot.default
处理多个参数的方式),但我指的是
null
参数值无效的特定情况。
test1 <- ifelse(is.na(L), NA, ifelse(L > test, 1, 0))
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)
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)