2013-04-25 65 views
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)#apply功能到新列

一切國際泳聯下去,直到最後一個字符串,我」 m得到這個錯誤:

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

有人可以請教我嗎? 您的幫助將不勝感激。

+0

這是哪一種語言? R' – 2013-04-25 18:56:32

+0

對不起,在R – Cat 2013-04-25 18:59:28

+0

嘗試''update_cat $ bobpresent < - ifelse(all(is.na(update_cat [,x])),1,0)'其中x只是列名'c(「bob1999」, 「bob2000」,「bob2001」)..... – haki 2013-04-25 19:08:57

回答

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中遇到的錯誤,但修復程序的邏輯是另一回事,而且您的帖子中沒有足夠的信息。

+0

謝謝你的建議。他們都沒有工作。它成功地將0中的所有東西都轉換成了不區分列與其他數據(如1,2 - 這些是捕獲的動物的數量)。任何想法發生了什麼? – Cat 2013-04-25 19:29:59

+0

您需要爲我們提供一小部分數據樣本,以便了解每列中的數據類型(及其類別)。另外,你的函數並不引用外部變量'x',而是引用你在'sapply'調用中命名的變量。我的猜測是你想要做別的事情。你能在一些循環中寫出僞代碼,所以我們知道應該發生什麼? – 2013-04-25 20:05:41