2013-12-20 21 views
1

我正在嘗試在R中編寫一個函數,它將數據類中的物種列聚合在一起。 (爲了詳細闡述我在做什麼......我有一個數據框,有多個植物物種,適合多個地點和多年,有些物種被錯誤識別,所以我想分組到更多一般水平(例如,spp a和spp b在這些年中混在一起;所以我想創建一個名爲spp.ab的新列,其中spp a和b的數據集中在一起))。使用函數在R data.frame中添加一列

例子:

spp.a spp.b 
    1  0 
    2  3 
    0  4 
    3  2 
    4  5 

我想最終與來自值從兩個物種顯示最大的單個列結束了:

spp.ab 
    1 
    3 
    4 
    3 
    5 

我已經開始寫一個函數這是這樣做的;然而,我很擔心將新的列添加到我的數據集並刪除舊的列。有人能告訴我我的代碼有什麼問題嗎?

lump <- function(db, spp.list, new.spp) { #input spp.list as c('spp.a', 'spp.b', ...) 
    mini.db <- subset(db, select=spp.list); 
    newcol <- as.vector(apply(mini.db, 1, max, na.rm=T)); 
    db$new.spp <- newcol 
    db <- db[,names(db) %in% spp.list] 
    return(db) 
} 

當我調用該函數本身

test <- lump(db, c('spp.a', 'spp.b'), spp.ab) 
test 

所有彈出是mini.db.我是否錯過了return()?

作爲參考,db是數據庫,spp.list是我想要聚集在一起的物種,而new.spp是我想要的新列名。

感謝您的幫助,
保羅

回答

1

我已經想通了......愚蠢的錯誤,當然。以下是可用的代碼:

lump <- function(db, spp.list, new.spp) { #input spp.list as a c('spp.a', 'spp.b', ...), and new.spp must be in quotes (e.g. 'new.spp') 
    mini.db <- subset(db, select=spp.list); 
    newcol <- as.vector(apply(mini.db, 1, max, na.rm=T)); 
    newcol[newcol==-Inf] <- NA; 
    db[new.spp] <- newcol; 
    db <- db[, !names(db) %in% spp.list]; 
    return(as.data.frame(db)); 
} 

關鍵是在db[new.spp] <- newcol;行。顯然使用這個工程,但使用db$new.spp <- newcol不。然後,我還添加了!到行db <- db[,!names(db) %in% spp.list]。這是我最大的錯誤。

+0

那麼'new.spp'是新列的名稱? –

+0

正確,您可以通過將名稱放在引號中作爲函數的參數來調用它。例如,如果你想稱它爲el.conquistador,你可以輸入lump(db,c('spp.a','spp.b'),'el.conquistador') – logicForPresident

0

雖然好像你已經找到你的答案,我會建議,相反,pmax功能:

> with(db, pmax(spp.a, spp.b)) 
[1] 1 3 4 3 5 

您可以使用此與withintransform模仿你的函數:

out <- within(db, spp.ab <- pmax(spp.a, spp.b)) 
out 
# spp.a spp.b spp.ab 
# 1  1  0  1 
# 2  2  3  3 
# 3  0  4  4 
# 4  3  2  3 
# 5  4  5  5 
相關問題