我在R中有下表。它显示了千桶的原油进口量。列是年份,每年的行数为:
> oil
Year
Month 2014 2015 2016 2017
1 288458 293297 300915 331240
2 256340 259626 291915 281094
3 286934 298196 310038 311840
4 288002 281216 294659 307314
5 291004 294570 315600 329468
6 265109 288139 301625 307190
7 294363 296712 326494 305336
8 288878 305609 319990 0
9 275435 280736 305981 0
10 276658 274087 300671 0
11 270260 274532 308776 0
12 291463 302014 303563 0
这是表类:
> class(oil)
[1] "xtabs" "table"
我想把它重新组合成几个季度而不是几个月:
Quarter 2014 2015 2016 2017
1 288458 293297 300915 331240
2 256340 259626 291915 281094
3 286934 298196 310038 311840
4 288002 281216 294659 307314
请注意,这不是实际的季度数字,我将其用于说明。
这样做的最佳方式是什么?
答案 0 :(得分:1)
您可以在列表中定义间隔(1:3,4:6,7:9,10:12),然后在lapply
colSums
上对每三行进行求和,之后rbind
do.call
的输出data(iris)
mytable <- with(iris, table(Sepal.Length, Species))
mytable <- mytable[1:12,]
> mytable
Species
Sepal.Length setosa versicolor virginica
4.3 1 0 0
4.4 3 0 0
4.5 1 0 0
4.6 4 0 0
4.7 2 0 0
4.8 5 0 0
4.9 4 1 1
5 8 2 0
5.1 8 1 0
5.2 3 1 0
5.3 1 0 0
5.4 5 1 0
mylist <- list(1:3, 4:6, 7:9, 10:12)
quartertable <- do.call(rbind, lapply(mylist, function(x) colSums(mytable[x,])))
> quartertable
setosa versicolor virginica
[1,] 5 0 0
[2,] 11 0 0
[3,] 20 4 1
[4,] 9 2 0
。
mylist <- list(1:3, 4:6, 7:9, 10:12)
oil_quarters <- do.call(rbind, lapply(mylist, function(x) colSums(oil[x, ])))
对于你的例子,这将是:
lockId
答案 1 :(得分:0)
使用dplyr
,如果您的数据位于data.frame
,则可以
oil %>%
group_by(quarter = ceiling(Month/3)) %>%
select(-Month) %>%
summarise_each(funs(sum))
这适用于石油
oil <- fread('Month 2014 2015 2016 2017
1 288458 293297 300915 331240
2 256340 259626 291915 281094
3 286934 298196 310038 311840
4 288002 281216 294659 307314
5 291004 294570 315600 329468
6 265109 288139 301625 307190
7 294363 296712 326494 305336
8 288878 305609 319990 0
9 275435 280736 305981 0
10 276658 274087 300671 0
11 270260 274532 308776 0
12 291463 302014 303563 0', header = T)