【问题标题】:Can I aggregate with parameters taken from data frame?我可以使用从数据框中获取的参数进行聚合吗?
【发布时间】:2017-11-02 12:15:57
【问题描述】:

我想在循环中执行不同的聚合以应用于我的数据的不同行子集,但实现起来似乎很棘手(如果可能的话):

t <- data.frame(agg=c(list("field1"=field1, "field2"=field2), ...),
                fun=c(mean, ...))
f <- function(x) {
    for (i in 1:nrow(t) {
        y <- aggregate(x, by=t$agg[i], FUN=t$fun[i])
        # do something with y
    }
}

一个问题是字段列表agg在尝试构建数据框时触发错误(“object 'field1' not found”),另一个问题是R没有喜欢将函数值分配给fun(“无法将类“”函数“”强制转换为 data.frame”)。

附录: 我的数据的一个具体示例(只是为了匹配上面的定义)可能是:

> d <- data.frame(field1=round(rnorm(5, 10, 1)),field2=letters[round(rnorm(5, 10, 1))], field3=1:5)
> d
  field1 field2 field3
1     11      j      1
2     11      i      2
3     10      j      3
4     12      i      4
5     11      j      5
> with(d, aggregate(d$field3,by=list(field1, field2),FUN=mean))
  Group.1 Group.2 x
1      11       i 2
2      12       i 4
3      10       j 3
4      11       j 3

玩弄数据框中的变量名,我还是明白了:

> with(d,t <- data.frame(agg=c(list("field1"=field1, "field2"=field2)),fun=c(mean)))
Error in as.data.frame.default(x[[i]], optional = TRUE) : 
  cannot coerce class ""function"" to a data.frame

【问题讨论】:

  • by 参数应该有一个与x 长度相同的向量。这个条件是否满足?你能提供一个可重现的例子吗?
  • 为什么要使用数据框而不是列表?
  • @Leo P:“你为什么要为此使用数据框而不是列表?” 是否意味着你有一个列表的解决方案?
  • 好吧,考虑到您可以将任何对象保存到列表中(例如函数)而不受数据框的限制,这似乎是显而易见的选择。您应该构建包含多个变量的函数:让byFUN 由函数调用定义,而不是在函数中修复它。 f &lt;- function(var, data, group1, group2, fun) {... with(data, aggregate(data[, var], by = list(data[, c(group1, group2)], FUN = fun)) ...} 在我看来是更好的方法。

标签: r function dataframe aggregate


【解决方案1】:

问题有很多,主要是由于 R 对一般处理产生异常:

  • 首先,向量不能嵌套,但只有列表可以。仍然要求所有元素具有相同的类型。
  • 其次,data.frame 在构造变量时做了一些神奇的处理(导致无法分配闭包),因此无法使用。
  • 最后我不得不引用变量来按名称聚合

所以定义看起来像这样(, ... 的意思是“添加更多相似的项目”):

t <- list(agg=list(c("field1", "field2"), ...),
          fun=list(mean, ...))

f <- function(x) {
    for (i in 1:length(t$agg)) {
        agg <- t$agg[[i]]
        aggList <- lapply(agg, FUN=function(e) x[[e]])
        names(aggList) <- agg
        y <- aggregate(x, by=aggList, FUN=t$fun[[i]])
        # do something with y
    }
}

注意:在实际解决方案中,我添加了另一个列表,其中包含要为聚合数据框选择的列名称,以避免出现有关 mean 返回 NA 的警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多