2017-06-01 45 views
0

我想在一个循环中执行不同的聚合被应用到我的数据的不同行子集,但它似乎棘手的实现(如果可能的话):我可以使用从数据框中获取的参数进行聚合吗?

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 
+0

'by'参数应该有一个与'x'长度相同的向量。这个条件是否满足?你能提供一个可重复的例子吗? –

+0

为什么你会用这个数据框来代替列表? – LAP

+0

@Leo P:是_“你为什么要用这个数据框而不是列表?”_表示你有一个列表解决方案? –

回答

0

的问题是几个,大多是由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的警告。

相关问题