繁体   English   中英

使用函数在R 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM