Как создать кумулятивную переменную, которая группируется по 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)