0

我有一个数据框,我想根据之前列中的记录创建一个具有 0/1 的新列(这将代表一个物种的缺席/存在)。我一直在尝试这个:

update_cat$bobpresent <- NA #creating the new column

x <- c("update_cat$bob1999", "update_cat$bob2000", "update_cat$bob2001","update_cat$bob2002", "update_cat$bob2003", "update_cat$bob2004", "update_cat$bob2005", "update_cat$bob2006","update_cat$bob2007", "update_cat$bob2008", "update_cat$bob2009") #these are the names of the columns I want the new column to base its results in

bobpresent <- function(x){
  if(x==NA)
    return(0)
  else
    return(1)
} # if all the previous columns are NA then the new column should be 0, otherwise it should be 1

update_cat$bobpresence <- sapply(update_cat$bobpresent, bobpresent) #将函数应用到新列

一切都很顺利,直到我收到此错误的最后一个字符串:

Error in if (x == NA) return(0) else return(1) : 
  missing value where TRUE/FALSE needed

有人可以给我建议吗?您的帮助将不胜感激。

4

1 回答 1

3

根据定义,所有操作NA都将产生NA,因此x == NA 总是计算为NA。如果要检查一个值是否为NA,则必须使用该is.na函数,例如:

> NA == NA
[1] NA
> is.na(NA)
[1] TRUE

您传递给的函数sapply期望 TRUE 或 FALSE 作为返回值,但它却得到 NA ,因此出现错误消息。你可以通过重写你的函数来解决这个问题:

bobpresent <- function(x) { ifelse(is.na(x), 0, 1) }

无论如何,根据您的原始帖子,我不明白您要做什么。此更改仅修复了您遇到的错误sapply,但修复程序的逻辑是另一回事,并且您的帖子中没有足够的信息。

于 2013-04-25T19:06:16.173 回答