Рассчитать процентное изменение в одном столбце с первого по прошлый год

Я хочу рассчитать процентное изменение между первым годом 2015 и последний год 2017 как одно значение для каждого city,

Вот мой воспроизводимый пример, где последний столбец perct_change_2015_2017 желаемый результат. Как мне сделать это в R для целой группы городов? Желательно в дплыр.

РЕДАКТИРОВАТЬ с правильными цифрами изменения процента

example <- structure(list(city = c("Amsterdam", "Amsterdam", "Amsterdam", 
"Rotterdam", "Rotterdam", "Rotterdam"), year = c(2015L, 2016L, 
2017L, 2015L, 2016L, 2017L), value = c(30L, 35L, 46L, 23L, 19L, 
17L), perct_change_2015_2017 = c(0.5333333333, 0.5333333333, 
0.5333333333, -0.2608695652, -0.2608695652, -0.2608695652)), .Names = c("city", 
"year", "value", "perct_change_2015_2017"), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"), spec = structure(list(
    cols = structure(list(city = structure(list(), class = c("collector_character", 
    "collector")), year = structure(list(), class = c("collector_integer", 
    "collector")), value = structure(list(), class = c("collector_integer", 
    "collector")), perct_change_2015_2017 = structure(list(), class = c("collector_double", 
    "collector"))), .Names = c("city", "year", "value", "perct_change_2015_2017"
    )), default = structure(list(), class = c("collector_guess", 
    "collector"))), .Names = c("cols", "default"), class = "col_spec"))

example

 A tibble: 6 x 4
  city       year value perct_change_2015_2017
  <chr>     <int> <int>                  <dbl>
1 Amsterdam  2015    30                  0.533
2 Amsterdam  2016    35                  0.533
3 Amsterdam  2017    46                  0.533
4 Rotterdam  2015    23                 -0.260
5 Rotterdam  2016    19                 -0.260
6 Rotterdam  2017    17                 -0.260

2 ответа

Решение

first а также last функция может быть полезной. Также важно использовать arrange функция, чтобы убедиться, что значения находятся в правильном порядке.

library(dplyr)

example2 <- example %>%
  arrange(city, year) %>%
  group_by(city) %>%
  mutate(perct_change_2015_2017 = (last(value) - first(value))/first(value)) %>%
  ungroup()
example2
# # A tibble: 6 x 4
#   city       year value perct_change_2015_2017
#   <chr>     <int> <int>                  <dbl>
# 1 Amsterdam  2015    30                  0.533
# 2 Amsterdam  2016    35                  0.533
# 3 Amsterdam  2017    46                  0.533
# 4 Rotterdam  2015    23                 -0.261
# 5 Rotterdam  2016    19                 -0.261
# 6 Rotterdam  2017    17                 -0.261

ДАННЫЕ

structure(list(city = c("Amsterdam", "Amsterdam", "Amsterdam", 
"Rotterdam", "Rotterdam", "Rotterdam"), year = c(2015L, 2016L, 
2017L, 2015L, 2016L, 2017L), value = c(30L, 35L, 46L, 23L, 19L, 
17L)), .Names = c("city", "year", "value"), row.names = c(NA, 
-6L), spec = structure(list(cols = structure(list(city = structure(list(), class = c("collector_character", 
"collector")), year = structure(list(), class = c("collector_integer", 
"collector")), value = structure(list(), class = c("collector_integer", 
"collector")), perct_change_2015_2017 = structure(list(), class = c("collector_double", 
"collector"))), .Names = c("city", "year", "value", "perct_change_2015_2017"
)), default = structure(list(), class = c("collector_guess", 
"collector"))), .Names = c("cols", "default"), class = "col_spec"), class = c("tbl_df", 
"tbl", "data.frame"))

Этот метод всегда будет использовать 2015 а также 2017независимо от того, сколько лет. Я предпочитаю решение www, используя first а также last в общем, но если у вас есть больше лет и вы хотите эти конкретные годы, вот как это сделать.

example %>% group_by(city) %>%
  mutate(perct_change_2015_2017 =
    (value[year == 2017] - value[year == 2015]) / value[year == 2015]
  )
# # A tibble: 6 x 4
# # Groups:   city [2]
#        city  year value perct_change_2015_2017
#       <chr> <int> <int>                  <dbl>
# 1 Amsterdam  2015    30              0.5333333
# 2 Amsterdam  2016    35              0.5333333
# 3 Amsterdam  2017    46              0.5333333
# 4 Rotterdam  2015    23             -0.2608696
# 5 Rotterdam  2016    19             -0.2608696
# 6 Rotterdam  2017    17             -0.2608696
Другие вопросы по тегам