1 问题描述:
在进行企业ST影响因素分析时,通常需要分年度的企业摘戴帽数据。但是从Wind数据库导出的数据不是分年度的,无法直接使用!
例如第2行,企业证券代码为600145,导出数据的时刻,该企业为*ST。第3列出了该企业摘戴帽的时间,即2010年5月4日首次*ST;2011年10月28日由*ST变ST,2012年8月29日去ST,2014年5月5日再次*ST。根据此信息,我们可以判断出,证券代码为600145的企业,2010年至2020年连续年份的ST数据(假设不区分*ST和ST):(2010,是)、(2011,是)、(2012,否)、(2013,否)、(2014,是)、(2015,是)、(2016,是)、(2017,是)、(2018,是)、(2019,是)、(2020,是)。
这样手动去处理企业年度ST数据非常麻烦,且容易出错!所以我们可以采用R语言,用编程的方式对数据进行批量处理。处理的思路是:
- 先把数据读入R软件;
- 将字符串进行拆分;
- 对于每个年度如果企业是ST则为1,如果不是ST则为0.
2 处理步骤
1 打开ST企业的Excel数据,并进行复制(不要复制第一行的变量名称)。
2 R语言代码(假设需要2018至2020年3年的数据):
firmData=read.table('clipboard',sep = "&")
install.packages("hash")
library(hash)
len=length(firmData$V1)
data=matrix(data=NA, nrow = len, ncol = 3)
for (i in 1:len){
strs=strsplit(firmData$V1[i],"[,:]")[[1]]
for(m in 1:length(strs)){
strs[m]=trimws(strs[m])
}
firstST=as.numeric(substr(strs[length(strs)],1,4))
temp=hash('2018'=0,'2019'=0,'2020'=0)
temp[firstST]=1
flag=TRUE
if(length(strs)<=2){
for(j in firstST:2021){
temp[j]=1
}
}
else{
for(j in (length(strs)/2-1):1){
year=as.numeric(substr(strs[2*j],1,4))
year
if (substr(strs[2*j-1],1,1)=="去" & flag==TRUE){
temp[year]=0
if(year-1>=firstST+1){
for (k in firstST+1:year-1){
temp[k]=1
}
}
flag=FALSE
firstST=year
}
if (substr(strs[2*j-1],1,1)!="去" & flag==FALSE){
temp[year]=1
if(year-1>=firstST+1){
for (k in firstST+1:year-1){
temp[k]=0
}
}
flag=TRUE
firstST=year
}
if (substr(strs[2*j-1],1,1)!="去" & flag==TRUE){
temp[year]=1
if(year-1>=firstST+1){
for (k in firstST+1:year-1){
temp[k]=1
}
}
flag=TRUE
firstST=year
}
}
if(flag==TRUE){
for(j in firstST:2021){
temp[j]=1
}
}
if(flag==FALSE){
for(j in firstST:2021){
temp[j]=0
}
}
}
data[i,]=c(temp$"2018", temp$"2019", temp$"2020")
}
3 R脚本运行完后,在命令行输入:data
,即可得到处理结果
> data
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 0 1 1
[3,] 0 1 1
[4,] 1 1 1
[5,] 1 1 1
[6,] 0 1 1
[7,] 0 0 1
[8,] 0 0 0
[9,] 0 0 0
[10,] 1 1 1
[11,] 0 0 0
[12,] 0 0 0
[13,] 0 0 0
[14,] 1 1 1
[15,] 0 0 0
[16,] 0 1 1
[17,] 0 0 0
[18,] 0 1 1
[19,] 0 1 1
[20,] 0 1 1
[21,] 0 0 0
[22,] 0 0 0
[23,] 0 0 0
[24,] 1 1 1
[25,] 0 1 1
[26,] 0 1 1
[27,] 0 1 1
[28,] 0 1 1
[29,] 0 0 1
[30,] 1 1 1
说明:其中,[2, ]行的0,1,1表示该企业2018年不是ST企业,2019年和2020年是ST企业。