今天有个小伙伴问了这样的一个问题:
Stata 中如何将每个公司过去 5 年的所有专利分类号合并成一个观测值?例如某个公司在 2010~2020 年间每年申请了一些专利,想得到一个这样的结果,例如 2020 年的结果是把 2015~2019 年的专利集合起来;2012 年的结果是把 2010~2011 年的专利集合起来。
下面是一个示例数据:
clear input str1000 stkcd 申请年 str1000 被引证专利 000001 2010 "CN106780011A;CN107798595A;CN107808340A" 000001 2012 "CN105741102A" 000001 2013 "CN103875211A;CN103875211B;CN103875211B;CN104935549A;CN106296186A;CN106296186B;CN107977564A;CN107977564B" 000001 2013 "CN105741439A;CN106228351A;CN107305660A;CN107305660B;CN107393213A;CN107609869A;TWI673662B;WO2014187400A1" 000001 2015 "CN106228351A" 000001 2016 "CN109302481A;CN109615423A;CN109615423B" 000001 2016 "CN109302481A" 000001 2016 "" 000001 2017 "CN108256843A;CN108615184A;CN109636369A;WO2019184571A1" 000001 2017 "CN107578237A;CN107798417A;CN107886328A;WO2019056789A1;WO2019100597A1;WO2019100598A1" 000001 2018 "CN104680361A" 000001 2019 "CN112860716A;CN112860716B" 000001 2019 "CN112822648A" 000001 2019 "" 000001 2019 "CN111859383A;CN111859383B" 000001 2019 "" 000001 2020 "" 000001 2020 "CN112822648A;CN111859383B" 000002 2010 "CN106780011A;CN107798595A;CN107808340A" 000002 2012 "CN105741102A" 000002 2013 "CN103875211A;CN103875211B;CN103875211B;CN104935549A;CN106296186A;CN106296186B;CN107977564A;CN107977564B" 000002 2013 "CN105741439A;CN106228351A;CN107305660A;CN107305660B;CN107393213A;CN107609869A;TWI673662B;WO2014187400A1" 000002 2015 "CN106228351A" 000002 2016 "CN109302481A;CN109615423A;CN109615423B" 000002 2016 "CN109302481A" 000002 2016 "" 000002 2017 "CN108256843A;CN108615184A;CN109636369A;WO2019184571A1" 000002 2017 "CN107578237A;CN107798417A;CN107886328A;WO2019056789A1;WO2019100597A1;WO2019100598A1" 000002 2018 "CN104680361A" 000002 2019 "CN112860716A;CN112860716B" 000002 2019 "CN112822648A" 000002 2019 "" 000002 2019 "CN111859383A;CN111859383B" 000002 2019 "" 000002 2020 "" 000002 2020 "CN112822648A;CN111859383B" end compress
format 被引证专利 %10s drop if missing(被引证专利) gsort stkcd 申请年 save data, replace
|
首先我们来试下 000001 公司 2016 年的结果:
use data, clear local i = "000001" local y = 2016 keep if stkcd == "`i'" & 申请年 < `y' & 申请年 >= `=`y'-5'
|
然后我们使用一个 forval 循环吧所有的专利用 ; 连接起来:
local v = "" forval j = 1/`=_N' { local v = "`v';`=被引证专利[`j']'" } di "`v'"
*> ;CN105741102A;CN103875211A;CN103875211B;CN103875211B;CN104935549A;CN106296186A;CN106296186B;CN107977564A;CN107977564 *> > B;CN105741439A;CN106228351A;CN107305660A;CN107305660B;CN107393213A;CN107609869A;TWI673662B;WO2014187400A1;CN106228 *> > 351A
|
然后我们就可以编写程序循环所有公司和年份了:
use data, clear gen 被引证专利集合 = ""
levelsof stkcd, local(stkcd)
foreach i in `stkcd' { forval y = 2011/2020 { preserve keep if stkcd == "`i'" & 申请年 < `y' & 申请年 >= `=`y'-5' local v = "" forval j = 1/`=_N' { local v = "`v';`=被引证专利[`j']'" } restore replace 被引证专利集合 = "`v'" if stkcd == "`i'" & 申请年 == `y' } }
replace 被引证专利集合 = ustrregexs(1) if ustrregexm(被引证专利集合, "^;(.*)")
|
这样就可以得到想要的结果了:

点击这里跳转到 RStata 短书平台获取附件:Stata:如何将每个公司过去 5 年的所有专利分类号合并成一个观测值?
评论