我想在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)
,它会传递错误消息,因为CNTRY
和VALUE
不是对象,而是对象中的列。有任何想法吗?提前谢谢。
答案 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也有某种方法可以做到这一点,但我说不要打扰。