use data2, clear split 历史评级, parse(;) drop 历史评级 gather 历史评级* dropifmi(value) dropvar split value, parse(,) drop value ren value1 评级日期 ren value2 评级
不过如果观测值数据很多、历史评级很多,这个方法会非常低效,甚至无法实现。
今天我们再介绍一种使用 Mata 的方法。
附件中的 _gipc_count.ado 是我编写的一个 egen 函数,可以用来统计字符串使用特定字符拆分后得到的子字符串数量:
use data2, clear *- 统计可拆分的数量: egenn = ipc_count(历史评级), parse(;)
然后我们把历史评级数据读取到 Mata 里面处理:
mata: mata clear // 把历史评级数据读入 mata v1 = st_sdata(., "历史评级") v1
// 转换成行向量 v2 = rowshape(v1, cols(v1)) v2
// 连接起来 v3 = invtokens(v2, ";") v3
// 使用分号拆分 v4 = ustrsplit(v3, ";") v4
// 转换成列向量 v5 = colshape(v4, rows(v4)) v5 end
v5 就是拆分的结果,为了让 v5 能够直接插入 Stata 的变量中,我们可以用 expand 命令把观测值扩充下:
*- 拓展数据 expand n gsort 序号
然后就可以直接把 v5 创建成变量了:
*- 从 mata 的 v5 再创建变量 mata: stata("cap drop newvar") st_addvar("strL", "newvar") st_sstore(., "newvar", v5) end
然后再简单处理下:
drop 历史评级 dropifmi(newvar) split newvar, parse(,) drop newvar gen date = date(newvar1, "YMD") format date %tdCY-N-D drop newvar1 n ren date 评级日期 ren newvar2 评级 append using data drop 历史评级 destring 序号, replace gsort 万得代码 评级日期
评论