2017-08-09 220 views
0

私は、SIC産業分類を持つ企業を対応するFama-France業界分類にマッピングしなければならないプロジェクトに取り組んでいます。私はIan Gowがこれを行うためのスクリプトを正常に作成していることを発見しました。スクリプトは次のURLから入手できます:https://iangow.wordpress.com/2011/05/17/getting-fama-french-industry-data-into-r/SICからFamaFrenchへのマッピング産業分類

ただし、スクリプトまたはデータセットに不具合があり、何らかの理由で「Siccodes30.txt」で動作しません。具体的には、「Siccodes30.txt」から「6726-6726ユニットのinvトラスト、クローズドエンド」に関連する行に対して正しい結果(マッピング)を生成しません。私は問題の原因を突き止めようとしていますが、成功していません。

以下の記事では、元のスクリプト(より効率的にするための余裕があります)と、オンラインの例で動作させるために最後にいくつかの行を追加しました。

オリジナルスクリプト(投稿を短くするコメントを削除しました)繰り返しますが、これは私のスクリプトではありません(元のスクリプトが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と142の

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 

結果が間違っている代わりに。業界の数の文字列を提供します。

おかげ

PS Iは、例えば(スクリプトを短くする余地があると言ったように、あなたがCRする必要はありません。空白を取り除くために別の機能を使う、トリムを使うことができますが)元の作者に信用を与えるために、私は元の形でスクリプトを保存しました。ただし、誰かが問題を解決できる場合は、スクリプトの残りの部分も更新するようにしてください。

答えて

0

スクリプトに間違いはありません。問題は、txtファイルの2行(141と142)の書式設定にあります。

テキストエディタでテキストファイルを開き、これらの2行の内容を削除して再入力しました。 Rスクリプトを再実行すると、問題はなくなりました。

関連する問題