2013-12-20 86 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 
相关问题