将每4列汇总在一起(在大型数据集上将季度数据转换为年度数据)

时间:2017-06-30 04:26:47

标签: r dataframe rowsum

我有一个(大)格式的数据框:

Variable    Country         2007-Q1 2007-Q2 2007-Q3 2007-Q4 2008-Q1 2008-Q2 2008-Q3 2008-Q4
Var1        AR:Argentina    69.8    67.3    65  63.6    60.4    56.6    54.4    57.3
Var2        AR:Argentina    191.298 196.785 196.918 207.487 209.596 219.171 216.852 213.124
Var3        AR:Argentina    594.67  606.157 620.783 652.59  662.784 663.191 676.188 735.065
Var4        AR:Argentina    49.6    47.5    45.2    44.4    41.7    38.7    36.8    39.3
Var5        AR:Argentina    135.971 138.885 137.005 144.903 144.757 149.803 146.492 146.102
Var6        AR:Argentina    422.679 427.808 431.909 455.75  457.752 453.288 456.791 503.906
Var8        AR:Argentina    9.657   10.755  11.856  13.267  14.47   16.523  16.727  16.235

基本上,每一行每年有4列数据,按季度排序。 我想把它变成年度数据。

这样做的一种方法是简单地总结每4列(例如,2008-Q1:2008-Q4将被加总)。我认为另一种方法是过滤那些在(2007 - **或其他东西)中共享共同年份的列,然后在它们上运行RowSums(),但这听起来效率会低得多。

我希望得到一个看起来像这样的数据框:

Variable Country 2007 2008
Var1 AR:Argentina SUMXX SUMXX

甚至更好:

Country Year Var1 Var2
AR:Argentina 2007 SUMXX SUMYY
AR:Argentina 2008 SUMXX SUMYY

第二种格式是首选,但第一种格式也很好。最重要的是,我需要能够为所有年份的国家选择变量的数据 - 相对容易。如果我可以为所有国家选择任何给定变量 - 甚至更好(第二种格式)。

除了运行嵌套循环等之外,有没有简单的方法来实现这一目标?

2 个答案:

答案 0 :(得分:2)

如何转置数据t(df)以将列转换为行 他们使用移动平均值

Calculating moving average

library(TTR)
sma(AR:Argentina,4)

对于更快的移动平均线,您可能希望在上面的链接中看到Rccp选项

另一种策略是

a=ncol(df)

然后总结

df[1:4]
df[5:8]

,直到

df[a-3,a]

y=NULL
for (i in 1:a-3){
y[i]=sum(df[i:i+3]
} 

Pseudocode

答案 1 :(得分:2)

我真的不明白AR:阿根廷'意思是但我能够得到你想要的列数。我添加了一个id列来标识行。

> df
 Source: local data frame [12 x 3]
 Groups: id [?]

       id  year yearly_total
      <int> <chr>        <dbl>
 1      1  2007      792.488
 2      1  2008      858.743
 3      2  2007     2474.200
 4      2  2008     2737.228
 5      3  2007      186.700
 6      3  2008      156.500
 7      4  2007      556.764
 8      4  2008      587.154
 9      5  2007     1738.146
 10     5  2008     1871.737
 11     6  2007       45.535
 12     6  2008       63.955

结果如下:

library(tidyr)
library(dplyr)
df <- data%>%gather(year_quarter,value,-Country,-Variable)%>%
                   mutate(year = sapply(strsplit(year_quarter,"-"),`[`, 1))%>%
                   group_by(Variable,year)%>%
                   summarise(yearly_total = sum(value))%>%
                   spread(year,yearly_total)


df2 <- data%>%select(Variable,Country)%>%
                  left_join(df,"Variable")

id = 1表示数据帧的行= 1,而792.488表示2007年四季度的表,依此类推。

这是经过编辑的版本:

> df2
  # A tibble: 6 × 4
   Variable      Country   `2007`   `2008`
     <chr>        <chr>    <dbl>    <dbl>
1     var1 AR:Argentina  792.488  858.743
2     var2 AR:Argentina 2474.200 2737.228
3     var3 AR:Argentina  186.700  156.500
4     var4 AR:Argentina  556.764  587.154
5     var5 AR:Argentina 1738.146 1871.737
6     var6 AR:Argentina   45.535   63.955

输出结果为:

> data
# A tibble: 6 × 10
     Variable      Country `2007-Q1` `2007-Q2` `2007-Q3` `2007-Q4` `2008-Q1` `2008-Q2` `2008-Q3`
      <chr>        <chr>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>
 1     var1 AR:Argentina   191.298   196.785   196.918   207.487   209.596   219.171   216.852
 2     var2 AR:Argentina   594.670   606.157   620.783   652.590   662.784   663.191   676.188
 3     var3 AR:Argentina    49.600    47.500    45.200    44.400    41.700    38.700    36.800
 4     var4 AR:Argentina   135.971   138.885   137.005   144.903   144.757   149.803   146.492

我能够以第一种格式获得它。 left_join需要获取Country列。

此外,这是我在R中导入数据时的样子:

type="matrix"