R 中不同年份的平均百分比变化
Average percentage change over different years in R
我有一个数据框,我从中创建了一个可重现的示例:
country <- c('A','A','A','B','B','C','C','C','C')
year <- c(2010,2011,2015,2008,2009,2008,2009,2011,2015)
score <- c(1,2,2,1,4,1,1,3,2)
country year score
1 A 2010 1
2 A 2011 2
3 A 2015 2
4 B 2008 1
5 B 2009 4
6 C 2008 1
7 C 2009 1
8 C 2011 3
9 C 2015 2
我正在尝试通过计算每年的 [(最终得分 - 初始得分)÷(初始得分)] 并将其平均数来计算每个国家/地区得分的平均百分比增加(或减少)年
country year score change
1 A 2010 1 NA
2 A 2011 2 1
3 A 2015 2 0
4 B 2008 1 NA
5 B 2009 4 3
6 C 2008 1 NA
7 C 2009 1 0
8 C 2011 3 2
9 C 2015 2 -0.33
我希望得到的最终结果:
country avg_change
1 A 0.5
2 B 3
3 C 0.55
如您所见,诀窍在于各个国家/地区跨越不同的年份,有时中间缺少年份。我尝试了不同的方法来手动完成,但我确实很挣扎。如果有人可以暗示我一个解决方案会很棒。非常感谢。
使用 dplyr
,我们可以 group_by
country
并得到 scores
.
之间的差异 mean
library(dplyr)
df %>%
group_by(country) %>%
summarise(avg_change = mean(c(NA, diff(score)), na.rm = TRUE))
# country avg_change
# <fct> <dbl>
#1 A 0.500
#2 B 3.00
#3 C 0.333
使用具有相同逻辑的基数 R aggregate
aggregate(score~country, df, function(x) mean(c(NA, diff(x)), na.rm = TRUE))
我们可以用data.table
按'country'分组,取'score'和[=17=的lag
之差mean
=]
library(data.table)
setDT(df1)[, .(avg_change = mean(score -lag(score), na.rm = TRUE)), .(country)]
# country avg_change
#1: A 0.5000000
#2: B 3.0000000
#3: C 0.3333333
我有一个数据框,我从中创建了一个可重现的示例:
country <- c('A','A','A','B','B','C','C','C','C')
year <- c(2010,2011,2015,2008,2009,2008,2009,2011,2015)
score <- c(1,2,2,1,4,1,1,3,2)
country year score
1 A 2010 1
2 A 2011 2
3 A 2015 2
4 B 2008 1
5 B 2009 4
6 C 2008 1
7 C 2009 1
8 C 2011 3
9 C 2015 2
我正在尝试通过计算每年的 [(最终得分 - 初始得分)÷(初始得分)] 并将其平均数来计算每个国家/地区得分的平均百分比增加(或减少)年
country year score change
1 A 2010 1 NA
2 A 2011 2 1
3 A 2015 2 0
4 B 2008 1 NA
5 B 2009 4 3
6 C 2008 1 NA
7 C 2009 1 0
8 C 2011 3 2
9 C 2015 2 -0.33
我希望得到的最终结果:
country avg_change
1 A 0.5
2 B 3
3 C 0.55
如您所见,诀窍在于各个国家/地区跨越不同的年份,有时中间缺少年份。我尝试了不同的方法来手动完成,但我确实很挣扎。如果有人可以暗示我一个解决方案会很棒。非常感谢。
使用 dplyr
,我们可以 group_by
country
并得到 scores
.
mean
library(dplyr)
df %>%
group_by(country) %>%
summarise(avg_change = mean(c(NA, diff(score)), na.rm = TRUE))
# country avg_change
# <fct> <dbl>
#1 A 0.500
#2 B 3.00
#3 C 0.333
使用具有相同逻辑的基数 R aggregate
aggregate(score~country, df, function(x) mean(c(NA, diff(x)), na.rm = TRUE))
我们可以用data.table
按'country'分组,取'score'和[=17=的lag
之差mean
=]
library(data.table)
setDT(df1)[, .(avg_change = mean(score -lag(score), na.rm = TRUE)), .(country)]
# country avg_change
#1: A 0.5000000
#2: B 3.0000000
#3: C 0.3333333