1

好的,所以我有一个配置数据框,它将指定如何在另一个数据框中聚合几列。

配置框架:

conf <- rbind(                                                                                                                                                                  
    c("a", "cnt"),                                                                                                                                                    
    c("b", "cnt")                                                                                                                          
    )                                                                                                                                                                                

和数据的数据框

dd <- data.frame(cbind(c("a1", "a1", "a1"), c("b1", "b1", "b2"), c(1, 2, 3)))
names(dd) <- c("a", "b", "cnt")

我想基本上运行这个命令:

aggregate(cnt ~ paste(conf[, 1], collapse=" + "), data=dd, sum)

理想情况下会返回

output
a1  b1 3
a1  b2 3

说得通?我觉得我在获取动态列名时丢失了 do.call 或 eval 的某些内容。或者也许将 names(dd) 列表与 conf[, 1] 相交

4

2 回答 2

2

这对我来说看起来更容易(在纠正了你的罪恶方式之后):

dd <- data.frame( c("a1", "a1", "a1"), c("b1", "b1", "b2"), c(1, 2, 3))
names(dd) <- c("a", "b", "cnt")

aggregate(dd$cnt , dd[ as.character(conf[, 1]) ], sum)
#--------
   a  b x
1 a1 b1 3
2 a1 b2 3
于 2013-06-26T20:14:19.367 回答
1

窃取@Justin 的建议是我最终做的。

aggregate(as.formula(paste("cnt", 
                           paste(conf[,1], collapse=" + "), 
                           sep=" ~ ")), data=dd, sum)
于 2013-06-26T18:13:26.667 回答