我想在循环中执行不同的聚合以应用于我的数据的不同行子集,但实现起来似乎很棘手(如果可能的话):
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'未找到”),另一个问题是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 :(得分:-1)
问题有几个,主要是由于R对一般处理做出了例外:
data.frame
在构造变量时会做一些神奇的处理(导致无法分配闭包),所以无法使用它。所以定义看起来像这样(其中, ...
表示&#34;添加更多类似的项目&#34;):
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
的警告。