2017-10-09 33 views
1

我在R中有下表,它顯示了原油在千桶中的進口量。列是這些年來,每年的月行: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

是的,@www,我想要得到季度總和。 – Agarp

回答

1

可以定義間隔在一個列表中,然後lapplycolSums在其上方,每隔三行綜上所述,事後rbind的這個輸出與do.call(1:9,10:12 3,4:6,7) 。

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, ]))) 
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)