R:重组表中的行

时间:2017-10-09 20:50:25

标签: r crosstab

我在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

请注意,这不是实际的季度数字,我将其用于说明。

这样做的最佳方式是什么?

2 个答案:

答案 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)