【问题标题】:Ignore NA's in sapply function忽略 sapply 函数中的 NA
【发布时间】:2011-06-27 22:58:32
【问题描述】:

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

如你们所知,sapply 函数有问题。关于如何忽略那些NA 的任何想法?我会尝试na.omit,如果我可以将所有NA 插入它们之前的位置,但我不知道该怎么做。

【问题讨论】:

  • 为什么不在 x 为 NA 时返回 NA 的 sapply 函数中添加另一个 if 语句?此外,如果您将 browser() 放在函数中的任何位置,下次运行时它将在该位置暂停。
  • 感谢您的回复!但是,我不确定我是否做对了,因为我仍然遇到同样的错误。这是我的代码 test1 test){1} else {0} ) 现在错误是: if ((x) == NA) { 中的错误:需要 TRUE/FALSE 的缺失值
  • 您必须使用is.na(x) 来检查它。 x == NA 返回 NA...

标签: function r sapply


【解决方案1】:

不需要sapply 和您的匿名函数,因为&gt; 已经矢量化了。

指定无效的默认参数值似乎也很奇怪。我的猜测是您将其用作杂物,而不是使用 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)

【讨论】:

  • 使用 null 的好处是它总是很容易显式传入。在某些情况下,生成“丢失”的参数是一种痛苦。
  • @hadley:我同意(这就是plot.default 处理多个参数的方式)但我指的是NULL 参数值无效的这种特定情况。
【解决方案2】:

这句话很奇怪:

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

试试:

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

【讨论】:

  • 非常感谢你们俩。非常感谢您的快速反馈!
  • 我不确定在此处再次提出单独但相关的问题是否合适。感谢大家的帮助,我想做一个小调整。我的数据的某些部分有空格,我想指定如果两列各有空格,则第 5 到第 10 列的值为 NA。我尝试使用的代码是这样的。我当然需要检查我的 if 语句。 a
  • 'if' 是一个控制结构。您可能想要返回向量的“ifelse”。
  • 我认为你需要像a[a[,10]=="" &amp; a[,11]=="",5:10] &lt;- NA 这样的东西。 is.na 用于测试变量是否为 NA,而不是用于将其设置为 NA。
【解决方案3】:

您希望结果中有 NA:s 吗?也就是说,你想让行对齐吗?

似乎只返回L &gt; 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)

【讨论】:

    猜你喜欢
    • 2018-04-24
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    相关资源
    最近更新 更多