Создать новый фрейм данных с ежегодным ростом переменной за определенный период - PullRequest
0 голосов
/ 10 октября 2018

Я изо всех сил пытаюсь создать новую таблицу с R (используя dplyr) из следующей (dfx).ID может быть географическим районом.Для каждого из них у меня есть значение (Значение), которое изменяется во времени (Год).

library(dplyr)

ID<-c(1, 1, 1, 2, 2, 3, 3, 3, 3)
Year <-c(1960,1970, 1975, 1970, 1995, 1970, 1990, 2000, 2005)
Value<-c(2, 4.5, 6.2, 3.2, 7.8, 3.2, 4.6, 6.7, 8.9)
dfx<-data_frame(ID, Year, Value)

Что я хотел бы сделать, это рассчитать для каждого периода годовое отклонение в соответствии с уравнением: [(final value/starting value)^(1/number of years)-1]*100.

Это дало бы следующее: df

ID<-c(1,1, 2, 3,3,3)
Periods<-c("1960-1970", "1970-1975", "1970-1995", "1970-1990","1990-2000","2000-2005") 
annual_var<-c(8.44, 6.61, 3.62, 1.83, 3.83, 5.84)
dfy<-data_frame(ID, Periods, annual_var) 

Я не могу понять, какова лучшая стратегия для подражания.Не могли бы вы помочь мне?

Большое спасибо за продвижение.

Fra;

1 Ответ

0 голосов
/ 10 октября 2018

С dplyr мы можем group_by ID, paste текущий и следующий Year вместе, используя lead, затем вычислить annual_var, используя приведенную формулу, и игнорировать последнюю строку в каждомгруппа (slice(-n())), так как последний период будет пустым.

library(dplyr)
dfx %>%
  group_by(ID) %>%
  mutate(Periods = paste0(Year, "-", lead(Year)), 
     annual_var = ((lead(Value)/Value) ^ (1/(lead(Year) - Year)) - 1) * 100) %>%
  slice(-n()) %>%
  select(-Year, -Value)

#    ID   Periods   annual_var
#   <dbl> <chr>          <dbl>
#1    1. 1960-1970       8.45
#2    1. 1970-1975       6.62
#3    2. 1970-1995       3.63
#4    3. 1970-1990       1.83
#5    3. 1990-2000       3.83
#6    3. 2000-2005       5.84
...