我有一个(大)格式的数据框:
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
。
第二种格式是首选,但第一种格式也很好。最重要的是,我需要能够为所有年份的国家选择变量的数据 - 相对容易。如果我可以为所有国家选择任何给定变量 - 甚至更好(第二种格式)。
除了运行嵌套循环等之外,有没有简单的方法来实现这一目标?
答案 0 :(得分:2)
如何转置数据t(df)
以将列转换为行
他们使用移动平均值
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"