将每 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
我有一个以下形式的(大)数据框:
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