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

Summing every 4 columns together (convert quarterly data to annual on a large dataset)

我有一个以下形式的(大)数据框:

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.

第二种格式更受欢迎,但第一种格式也可以。最主要的是我需要能够 select 一个变量的数据,一个国家,所有年份的数据——相对容易。如果我可以 select 所有国家/地区所有年份的任何给定变量 - 甚至更好(第二种格式)。

除了 运行 嵌套循环等之外,还有什么简单的方法可以做到这一点吗?

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

Calculating moving average

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

对于更快的移动平均线,您可能希望在上方 link 处查看 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

我不太明白 'AR:Argentina' 是什么意思,但我能够得到你想要的列总和。我添加了一个 id 列来标识行。

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

结果如下所示:

> 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

id=1 指的是你的数据框的 row=1 和 792.488 是 2007 年四个季度的 colsum 等等。

这是编辑后的版本:

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")

输出为:

> 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

我能够以第一种格式获得它。 left_join 是获取“国家/地区”列所必需的。

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

> 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