Среднее процентное изменение за разные годы в R - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть фрейм данных, из которого я создал воспроизводимый пример:

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 голосов
/ 19 декабря 2018

Мы можем использовать 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
0 голосов
/ 19 декабря 2018

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