R中不同年份的平均百分比变化

时间:2018-12-19 12:39:03

标签: r dataframe percentage

我有一个数据框,可以从中创建一个可复制的示例:

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

如您所见,诀窍在于国家/地区跨越不同的年份,有时介于两者之间。我尝试了不同的手动方式,但我确实很努力。如果有人可以暗示我一个解决方案,那就太好了。非常感谢。

2 个答案:

答案 0 :(得分:1)

使用dplyr,我们可以group_by country并得到mean之间的差异scores

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

答案 1 :(得分:0)

我们可以使用data.table按“国家/地区”分组,并获取“得分”与“得分”的mean之间差异的lag

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