R:如何根据列表中的列标准汇总(聚合)dfs的值?

时间:2015-10-27 20:03:58

标签: r list sum aggregate

我想在dfs列表中总结来自同一个国家/地区的所有值(df-wise!)。这里有一些示例数据:

df1 <- data.frame(CNTRY = c("A", "B", "C"), Value=c(3,1,4))
df2 <- data.frame(CNTRY = c("A", "B", "C", "C"),Value=c(3,5,8,7))
dfList <- list(df1, df2)
names(dfList) <- c("111.2000", "112.2000")

我的列表由dfs(仅限dfs)和不同的rownumbers组成, 但所有dfs的列结构相同。列表名是articleID和Year的混合,这超过了1000 dfs。 现在我的问题是:如何总结或汇总所有dfs中的国家/地区价值? 我的预期结果是:

$`111.2000`
  CNTRY Value
1     A     3
2     B     1
3     C     4

$`112.2000`
  CNTRY Value
1     A     3
2     B     5
3     C    15

我尝试了aggregate(Value ~ CNTRY, data=dfList,FUN=sum),它会传递错误消息,因为CNTRYVALUE不是对象,而是对象中的列。有任何想法吗?提前谢谢。

2 个答案:

答案 0 :(得分:4)

使用lapply()aggregate()功能应用于dfList

lapply(dfList, function(x) aggregate(Value ~ CNTRY, x, sum))
# $`111.2000`
#   CNTRY Value
# 1     A     3
# 2     B     1
# 3     C     4
#
# $`112.2000`
#   CNTRY Value
# 1     A     3
# 2     B     5
# 3     C    15

答案 1 :(得分:4)

DF的列表比野外的一堆DF好,但单个DF甚至更好:

library(data.table)
DF = rbindlist(dfList, idcol="id")

         id CNTRY Value
1: 111.2000     A     3
2: 111.2000     B     1
3: 111.2000     C     4
4: 112.2000     A     3
5: 112.2000     B     5
6: 112.2000     C     8
7: 112.2000     C     7

从那里,您可以根据data.table语法

进行聚合
DTres <- DF[, .(Value = sum(Value)), by=.(id, CNTRY)]

         id CNTRY Value
1: 111.2000     A     3
2: 111.2000     B     1
3: 111.2000     C     4
4: 112.2000     A     3
5: 112.2000     B     5
6: 112.2000     C    15

从这里开始,您可以执行

之类的操作
dcast(DTres, id ~ CNTRY)

         id A B  C
1: 111.2000 3 1  4
2: 112.2000 3 5 15

我确定在基地R也有某种方法可以做到这一点,但我说不要打扰。