我正在尝试在R中编写一个函数,它将物种列集合在一个data.frame中。
(详细说明我正在做的事情......我有一个多个植物种类的数据框,用于多个地点和多年。有些物种被误认,所以我想分组到更一般的level(例如,spp a和spp b在这些年中混淆了;所以我想创建一个名为spp.ab的新列,其中spp a和b的数据被集中在一起)。)
示例:
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就是我想要的新列。
感谢您的帮助,
保罗
答案 0 :(得分:2)
我已经弄清楚了...当然是愚蠢的错误。以下是有效的代码:
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]
。这是我最大的错误。
答案 1 :(得分:1)
虽然您似乎找到了自己的答案,但我建议使用pmax
函数:
> with(db, pmax(spp.a, spp.b))
[1] 1 3 4 3 5
您可以使用within
或transform
来模仿您的功能:
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