[英]Using lapply with an R function that selects a column of data.frame
[英]Using a function to add a column in R data.frame
我试图在R中编写一个函数,该函数将种类列集中在data.frame中。
(为详细说明我正在做的事情...我有一个数据框,其中包含多个站点和年份的多种植物物种。某些物种被误认了,所以我想归为一个更一般的层次(例如多年来,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是我想要的新列。
谢谢你的帮助,
保罗
我知道了...愚蠢的错误,当然。 这是有效的代码:
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]
。 这是我最大的错误。
虽然您似乎已经找到了答案,但我还是建议使用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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.