Условный расчет на основе других столбцов с запаздывающими значениями - PullRequest
0 голосов
/ 20 января 2020

Newb ie: у меня есть набор данных, в котором я хочу рассчитать рост продаж компании по сравнению с прошлым годом. Набор данных содержит ок. 1000 компаний с разным количеством лет котируются на фондовой бирже c. Данные выглядят так:

#      gvkey fyear at    company name
#22    17436 2010  59393 BASF SE
#23    17436 2011  61175 BASF SE
#24    17436 2012  64327 BASF SE
       ...
#30    17436 2018  86556 BASF SE
#31    17828 1989  62737 DAIMLER AG
#32    17828 1990  67339 DAIMLER AG
#33    17828 1991  75714 DAIMLER AG
       ...
#60    17828 2018  281619  DAIMLER AG

Я хотел бы создать новый столбец growth, где я рассчитываю процентное увеличение на at, например, от BASF SE (gvkey 17436) с 2010 по 2011 год, до 2012 и так далее. В строке № 31 условный оператор должен работать так, что он не будет рассчитывать увеличение на основе значений, которые принадлежат BASF, а скорее имеет значение NA. Поэтому следующим значением в этом новом столбце «рост» в строке 32 будет процентное увеличение DAIMLER (gvkey 17828) с 62727 до 67339

Пока я пытался:

if TA$gvkey == lag(TA$gvkey) {mutate(TA, growth = (at - lag(at))/lag(at))} else {NULL}

В основном Я попытался обусловить вычисление изменением идентификатора gvkey, так как это имеет для меня наибольшее значение Я считаю, что есть лучший способ запустить al oop до тех пор, пока gvkey не изменится и перейти к следующему набору значений - но я просто не знаю, как это кодировать.

Я очень новичок к R и совсем потерян. Буду признателен за любую поддержку! Спасибо, ребята:)

Ответы [ 2 ]

0 голосов
/ 20 января 2020

В этом случае функция group_by в dplyr - хороший инструмент для использования. С помощью group_by () в вашем столбце gv вы сегментируете вызов mutate () для отдельного применения для каждого отдельного значения gv. Вот быстрый пример, который я сделал с некоторыми фиктивными данными и теми же значениями столбцов:

library(dplyr)

dummyData = 
  data.frame(gvkey = c(111,111,111,222,222,222), 
             fyear = c(2010,2012,2011,2010,2011,2013), 
             at =c(2,4,2,4,5,10)
             )

dummyDataTransformed = dummyData %>% 
  group_by(gvkey) %>% 
  arrange(fyear) %>% #to make sure we are chronologically in order
  mutate(growth = at/lag(at,1) -1) %>% #subtract 1 to get year over year change
  ungroup() #I like to ungroup just to make sure i'm not bugging out any calculations I might add further down the line
0 голосов
/ 20 января 2020

Я не вижу способа сделать это в одной строке. Предполагая, что ваши данные называются данными, вы можете попробовать:

for(i in data$gvkey){
  a = subset(data,data$gvkey==i)  # a now contains the data of one company
  # calculate pairwise relative difference (assumes sorted years!)
  rel_diff = diff(a)/head(a,-1)   #diff computes pariwise difference and divide by a ( head(a,-1) removes the last element)
  a$growth = c(0,rel_diff) # extend data frame by result, first difference is 0
  #output tro somewhere
}

Это решение с r-base. Могут быть более эффективные способы, но это легко понять.

...