Связывание crsp и compustat в R через WRDS
Я использую R для подключения к WRDS. Теперь я хотел бы связать таблицы compustat и crsp. В SAS это может быть достигнуто с помощью макросов и таблицы ссылок CCM. Как лучше всего подойти к этой теме в R?
ОБНОВЛЕНИЕ ПРОГРЕССА:
Я загрузил таблицы crsp, compustat и ccm_link с wrds.
sql <- "select * from CRSP.CCMXPF_LINKTABLE"
res <- dbSendQuery(wrds, sql)
ccmxpf_linktable <- fetch(res, n = -1)
ccm.dt <- data.table(ccmxpf_linktable)
rm(ccmxpf_linktable)
Затем я преобразую предложенную процедуру сопоставления из файла sas исследования событий wrds в R:
ccm.dt[,typeflag:=linktype %in% c("LU","LC","LD","LN","LS","LX") & USEDFLAG=="1"]
setkey(ccm.dt, gvkey, typeflag)
for (i in 1:nrow(compu.dt)) {
gvkey.comp = compu.dt[i, gvkey]
endfyr.comp = compu.dt[i,endfyr]
PERMNO.val <- ccm.dt[.(gvkey.comp, TRUE),][linkdt<=endfyr.comp & endfyr.comp<=linkenddt,lpermno]
if (length(PERMNO.val)==0) PERMNO.val <- NA
suppressWarnings(compu.dt[i, "PERMNO"] <- PERMNO.val)
}
Однако этот код фантастически неэффективен. Я начал с data.table, но не совсем понял, как применять логику в цикле for. Я надеюсь, что некоторые из них могут указать мне, как улучшить цикл for.
2 ответа
Согласование полей по этапам работает лучше. возможно, кто-то найдет это полезным. Любые предложения по дальнейшему улучшению, конечно, очень приветствуются!!!
# filter on ccm.dt
ccm.dt <- ccm.dt[linktype %in% c("LU","LC","LD","LN","LS","LX") & USEDFLAG=="1"]
setkey(ccm.dt, gvkey)
setkey(compu.dt, gvkey)
compu.merged <- merge(compu.dt, ccm.dt, all.x = TRUE, allow.cartesian = TRUE)
# deal with NAs in linkenddt - set NAs to todays date, assuming they still exist.
today <- as.character(Sys.Date())
compu.merged[is.na(linkenddt), "linkenddt":=today]
# filter out date mismatches
compu <- compu.merged[linkdt <= endfyr & endfyr<=linkenddt]
Никакие петли не нужны. Просто используйте SQL (возможно, используяdbplyr
внутри Р). Глянь сюда .