【问题标题】:Using a function to add a column in R data.frame使用函数在 R data.frame 中添加列
【发布时间】:2013-12-21 09:26:59
【问题描述】:

我正在尝试在 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 是我想要的新列命名。

感谢您的帮助,
保罗

【问题讨论】:

    标签: r


    【解决方案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] &lt;- newcol; 行中。显然使用此方法有效,但使用 db$new.spp &lt;- newcol 无效。然后我还在db &lt;- db[,!names(db) %in% spp.list] 行中添加了!。这是我最大的错误。

    【讨论】:

    • 那么new.spp 是新列的名称?
    • 正确,您可以通过将名称放在引号中作为函数的参数来随意调用它。例如,如果您想将其命名为 el.conquistador,您可以输入 lump(db, c('spp.a', 'spp.b'), 'el.conquistador')
    【解决方案2】:

    虽然您似乎找到了答案,但我建议您改用 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
    

    【讨论】:

      猜你喜欢
      • 2019-09-29
      • 2015-07-22
      • 2010-12-30
      • 2015-02-01
      • 2017-07-02
      • 2022-01-11
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多