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

Not*_*tna 2 r percentage dataframe

我有一个数据框,从中创建了一个可重现的示例:

\n\n
country <- c('A','A','A','B','B','C','C','C','C')\nyear <- c(2010,2011,2015,2008,2009,2008,2009,2011,2015)\nscore <- c(1,2,2,1,4,1,1,3,2)\n\n  country year score\n1       A 2010     1\n2       A 2011     2\n3       A 2015     2\n4       B 2008     1\n5       B 2009     4\n6       C 2008     1\n7       C 2009     1\n8       C 2011     3\n9       C 2015     2\n
Run Code Online (Sandbox Code Playgroud)\n\n

我试图通过计算每年的 [(最终分数 - 初始分数) \xc3\xb7 (初始分数)] 并在几年内对其进行平均来计算每个国家/地区分数的平均增加(或减少)百分比。

\n\n
 country year score  change\n1       A 2010     1     NA\n2       A 2011     2      1\n3       A 2015     2      0\n4       B 2008     1     NA\n5       B 2009     4      3\n6       C 2008     1     NA\n7       C 2009     1      0\n8       C 2011     3      2\n9       C 2015     2  -0.33\n
Run Code Online (Sandbox Code Playgroud)\n\n

我希望获得的最终结果:

\n\n
  country  avg_change\n1       A         0.5\n2       B           3\n3       C        0.55\n
Run Code Online (Sandbox Code Playgroud)\n\n

正如您所看到的,诀窍在于国家/地区跨越不同的年份,有时中间会缺少年份。我尝试了不同的方法来手动完成,但我确实很挣扎。如果有人能提示我一个解决方案那就太好了。非常感谢。

\n

Ron*_*hah 6

有了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
Run Code Online (Sandbox Code Playgroud)

使用基本 Raggregate具有相同的逻辑

aggregate(score~country, df, function(x) mean(c(NA, diff(x)), na.rm = TRUE))
Run Code Online (Sandbox Code Playgroud)