2017-10-09 5 views
1

J'ai le tableau suivant dans R. Il montre les importations de pétrole brut dans les milliers de barils. Les colonnes sont les années et les lignes du mois de chaque année:R: Regroupement des rangées dans un tableau

> 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 

C'est la classe tables:

> class(oil) 
[1] "xtabs" "table" 

Je voudrais regrouper en quartiers au lieu de mois:

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 

Notez que ce ne sont pas des numéros trimestriels réels, je les utilise pour l'illustration.

Quelle est la meilleure façon de faire cela?

+0

Oui, @www, j'essaie d'obtenir la somme trimestrielle. – Agarp

Répondre

1

Vous pouvez définir l'intervalle (1: 3, 4: 6, 7: 9, 10:12) dans une liste, puis lapplycolSums au-dessus pour additionner toutes les trois rangées, et ensuite rbind la sortie de ce avec 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 

Pour votre exemple, ce serait:

mylist <- list(1:3, 4:6, 7:9, 10:12) 

oil_quarters <- do.call(rbind, lapply(mylist, function(x) colSums(oil[x, ]))) 
0

Avec dplyr, si vos données sont dans un data.frame vous pouvez faire

oil %>% 
    group_by(quarter = ceiling(Month/3)) %>% 
    select(-Month) %>% 
    summarise_each(funs(sum)) 

cela fonctionne avec de l'huile comme

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)