Stata:如何将每个公司过去 5 年的所有专利分类号合并成一个观测值?

今天有个小伙伴问了这样的一个问题:

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 年的所有专利分类号合并成一个观测值?

评论