Как создать кумулятивную переменную, которая группируется по PERMNO и упорядочивается по дате в R

У меня есть фреймворк с переменными из COMPUSTAT, содержащий данные по различным статьям бухгалтерского учета, включая коммерческие и административные расходы разных компаний.

Я хочу создать новую переменную в фрейме данных, которая накапливает SG&A расходы для каждой компании в хронологическом порядке. Я использую коды PERMNO в качестве уникального идентификатора для каждой компании.

Я пробовал этот код, но, похоже, он не работает:

      crsp.comp2$cxsgaq <- crsp.comp2 %>%
  group_by(permno) %>%
  arrange(date) %>%
  mutate_at(vars(xsgaq), cumsum(xsgaq))

(xsgag - это переменная COMPUSTAT для SG&A расходов)

Спасибо большое за помощь

2 ответа

Ваш пример кода пытается записать весь фрейм данных crsp.comp2, в переменную crsp.comp2$cxsgaq.

Обычно vars()переменные функции должны быть "заключены в кавычки"; хотя в вашей ситуации используйте стандартный mutate() функции и назначить cxsgaq там переменная.

      crsp.comp2 <- crsp.comp2 %>%
  group_by(permno) %>%
  arrange(date) %>%
  mutate(cxsgaq = cumsum(xsgaq))

Воспроизводимый пример с набором данных радужной оболочки:

      library(tidyverse)
iris %>% 
  group_by(Species) %>% 
  arrange(Sepal.Length) %>% 
  mutate(C.Sepal.Width = cumsum(Sepal.Width))

Основываясь на ответе @m-viking, при использовании сервера WRDS PostgreSQL вы просто должны использовать window_order (из dplyr) на месте arrange. (Я использую идентификатор фирмы Compustat gvkey на месте permno так что этот код работает, но идея та же.)

      library(dplyr, warn.conflicts = FALSE)
library(DBI)

pg <- dbConnect(RPostgres::Postgres(), 
                bigint = "integer", sslmode='allow')

fundq <- tbl(pg, sql("SELECT * FROM comp.fundq"))

comp2 <-
  fundq %>%
  filter(indfmt == "INDL", datafmt == "STD",
         consol == "C", popsrc == "D")

comp2 <- 
  comp2 %>%
  group_by(gvkey) %>%
  dbplyr::window_order(datadate) %>%
  mutate(cxsgaq = cumsum(xsgaq))

comp2 %>%
  filter(!is.na(xsgaq)) %>%
  select(gvkey, datadate, xsgaq, cxsgaq)
#> # Source:     lazy query [?? x 4]
#> # Database:   postgres [iangow@wrds-pgdata.wharton.upenn.edu:9737/wrds]
#> # Groups:     gvkey
#> # Ordered by: datadate
#>    gvkey  datadate   xsgaq cxsgaq
#>    <chr>  <date>     <dbl>  <dbl>
#>  1 001000 1966-12-31 0.679  0.679
#>  2 001000 1967-12-31 1.02   1.70 
#>  3 001000 1968-12-31 5.86   7.55 
#>  4 001000 1969-12-31 7.18  14.7  
#>  5 001000 1970-12-31 8.25  23.0  
#>  6 001000 1971-12-31 7.96  30.9  
#>  7 001000 1972-12-31 7.55  38.5  
#>  8 001000 1973-12-31 8.53  47.0  
#>  9 001000 1974-12-31 8.86  55.9  
#> 10 001000 1975-12-31 9.59  65.5  
#> # … with more rows

Создано 2021-04-05 пакетом REPEX (v1.0.0)

Другие вопросы по тегам