我正在研究一個項目,在該項目中我必須將具有SIC行業分類的公司映射到相應的Fama-French行業分類。我發現Ian Gow優雅地創造了這個腳本。該腳本可從以下網址獲得:https://iangow.wordpress.com/2011/05/17/getting-fama-french-industry-data-into-r/將SIC映射到FamaFrench行業分類
但是,腳本或數據集中存在小故障,由於某些原因,它不適用於「Siccodes30.txt」。更具體地說,它不會爲「Siccodes30.txt」中與「6726-6726 Unit inv trusts,closed-end」相關的行生成正確的結果(映射)。我一直在試圖找出問題的根源,但我還沒有成功。
在下面的文章中,我已經包含了原始腳本(有一些空間可以使它更有效率),並且在最後添加了幾行代碼以使它可以在線使用。
原始腳本(我刪除了評論,使帖子縮短)。再次,這是不是我的腳本(最初的劇本是在https://iangow.wordpress.com/2011/05/17/getting-fama-french-industry-data-into-r/
url4FF <- paste("http://mba.tuck.dartmouth.edu",
"pages/faculty/ken.french/ftp",
"Industry_Definitions.zip", sep="/")
f <- tempfile()
download.file(url4FF, f)
fileList <- unzip(f,list=TRUE)
trim <- function(string) {
ifelse(grepl("^\\s*$", string, perl=TRUE),"",
gsub("^\\s*(.*?)\\s*$","\\1",string,perl=TRUE))
}
extract_ff_ind_data <- function (file) {
ff_ind <- as.vector(read.delim(unzip(f, files=file), header=FALSE,
stringsAsFactors=FALSE))
ind_num <- trim(substr(ff_ind[,1],1,10))
for (i in 2:length(ind_num)) {
if (ind_num[i]=="") ind_num[i] <- ind_num[i-1]
}
sic_detail <- trim(substr(ff_ind[,1],11,100))
is.desc <- grepl("^\\D",sic_detail,perl=TRUE)
regex.ind <- "^(\\d+)\\s+(\\w+).*$"
ind_num <- gsub(regex.ind,"\\1",ind_num,perl=TRUE)
ind_abbrev <- gsub(regex.ind,"\\2",ind_num[is.desc],perl=TRUE)
ind_list <- data.frame(ind_num=ind_num[is.desc],ind_abbrev,
ind_desc=sic_detail[is.desc])
regex.sic <- "^(\\d+)-(\\d+)\\s*(.*)$"
ind_num <- ind_num[!is.desc]
sic_detail <- sic_detail[!is.desc]
sic_low <- as.integer(gsub(regex.sic,"\\1",sic_detail,perl=TRUE))
sic_high <- as.integer(gsub(regex.sic,"\\2",sic_detail,perl=TRUE))
sic_desc <- gsub(regex.sic,"\\3",sic_detail,perl=TRUE)
sic_list <- data.frame(ind_num, sic_low, sic_high, sic_desc)
return(merge(ind_list,sic_list,by="ind_num",all=TRUE))
}
FFID_30 <- extract_ff_ind_data("Siccodes30.txt")
我加入以下行允許測試腳本:上排141
library(gsheet)
url <-"https://docs.google.com/spreadsheets/d/1QRv8YmJv0pdhIVmkXMQC7GQuvXV21Kyjl9pVZsSPEAk/gid=1758600626"
companiesSIC <- read.csv(text=gsheet2text(url, format='csv'), stringsAsFactors=FALSE)
names(companiesSIC)
library(sqldf)
companiesFFID_30 <- sqldf("SELECT a.gvkey, a.SIC, b.ind_desc AS FF30,
b.ind_num as FFIndNUm30
FROM companiesSIC AS a
LEFT JOIN FFID_30 AS b
ON a.sic BETWEEN b.sic_low AND b.sic_high")
companiesFFID_30
結果與142是錯誤的而不是的行業數提供的字符串。
感謝
PS就像我說的有房使腳本更短(例如,你不需要CR吃掉一個單獨的函數來刪除空白區域,你可以使用修剪),但是爲了賦予原作者功勞,我保留了腳本的原始形式。但是,如果有人能解決問題,還應該嘗試更新腳本的其餘部分。