Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用函数在R data.frame中添加列_R - Fatal编程技术网

使用函数在R data.frame中添加列

使用函数在R data.frame中添加列,r,R,我试图在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 最后,我想用一个列来显示两

我试图在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
最后,我想用一个列来显示两个物种的最大from值:

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)
}

lump我已经弄明白了……当然是愚蠢的错误。下面是有效的代码:

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));
 }

lump虽然您似乎已经找到了答案,但我建议您使用
pmax
功能:

> with(db, pmax(spp.a, spp.b))
[1] 1 3 4 3 5
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
您可以将其与
内的
变换
一起使用,以模拟您的功能:

> with(db, pmax(spp.a, spp.b))
[1] 1 3 4 3 5
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

out所以
new.spp
是新列的名称吗?正确,您可以通过将名称作为函数的参数放在引号中来调用它。例如,如果您想将其命名为el.conquistrator,您可以输入lump(db,c('spp.a','spp.b'),'el.conquistrator'))