我有一个数据框架,我想在其中创建一个基于前几列中的记录的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
谁能给我点建议?非常感谢您的帮助。
根据定义,对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
获得的错误,但修复程序的逻辑是另一回事,并且您的帖子中没有足够的信息。