在前不久的课程中我们讲解了如何使用 R 语言爬取处理 WIPO 绿色专利分类数据:https://rstata.duanshu.com/#/brief/course/6edd7ed2f3284915b2c916ead3fbfd10
×
今天我们继续上次课的内容讲解如何使用得到的绿色专利列表结果进行绿色专利的筛选和统计。
×
作为演示,我们使用 2013 年的工企专利匹配结果进行操作,2000~2014 年的完整数据可以从这里下载得到:https://rstata.duanshu.com/#/brief/course/04f4aea3b97e42289e990e1ced0081bc
附件中有提供 2013 年的数据:
完整版:工企专利匹配2013(完整版).dta
汇总版:工企专利数量2013.dta
×
完整版是直接把工企数据和专利数据进行匹配,里面的一条条观测值是一条条的专利;,而汇总版是汇总每家工企申请的各种类型的专利数量以及所有专利的数量。
在上次的 使用 R 语言爬取处理 WIPO 绿色专利分类数据 的课程中,通过爬取分析,我们得到了四个文件:
ipcdf1.dta
ipcdf2.dta
ipcdf3.dta
ipcdf4.dta
下面我们来逐一根据这些列表从工企专利匹配结果中筛选绿色专利。
读取数据:
use "工企专利匹配2013(完整版).dta" , clear keep gqid zlid 分类号 主分类号save "gqzl2013sim" , replace
由于数据里面有分类号和主分类号两个字段,所以我分别根据两个字段处理得到了两份结果。
首先我们根据分类号进行筛选:
use gqzl2013sim, clear drop 主分类号
由于每个专利对应着多个分类号,分类号之间使用“;”分隔。所以首先我们需要先把分类号拆分开,这里有两种办法。
方法一:split + gather split 分类号, parse(";") drop 分类号 * 安装 gather:ssc install tidy gather 分类号* drop if missing(value) drop var ren value 分类号 save data1, replace
不过这种方法对于大数据的操作会非常慢,可以考虑使用循环 + append
方法二:split + forval + append use gqzl2013sim, clear split 分类号, parse (";" )ret list local k_new = r (k_new)drop 分类号 主分类号save temp, replace use temp, clear keep zlid gqid 分类号1drop if missing (分类号1)ren 分类号1 分类号save data2, replace forval i = 2/`k_new' { di "`i'" qui { use temp, clear keep zlid gqid 分类号`i' drop if missing (分类号`i' ) ren 分类号`i' 分类号 append using data2 save data2, replace } }
这种方法虽然代码稍微复杂,但是电脑处理起来更容易,不容易卡死,两种方法会得到同样的结果。
下面我们再处理分类号:
use data2, clear replace 分类号 = ustrregexs(1) if ustrregexm(分类号, "(.*)\(" )drop if !index (分类号, "/" )save data3, replace use data3, clear keep if index (分类号, " " )
然后我们就可以根据绿色专利列表进行筛选了。
根据 ipcdf1 进行筛选 ipcdf1 是只有大类类别的:
use ipcdf1.dta, clear use data3, clear gen class = substr (分类号, 1, 3)merge m :1 class using ipcdf1.dtakeep if _m == 3keep zlid gqid class l1title l2titleren class greenIPCsave dfres1, replace
根据 ipcdf2 进行筛选
这个时候报错了,检查可以发现,ipcdf2 中的 class 是存在重复值的。所以我们这个时候需要执行 m:m 的匹配,但是我们不能使用 merge 的 m:m 匹配,因为会得到错误的结果,例如下面这个案例:
clear input str10 name1 str3 gender"张三" "男" "李四" "男" "李梅" "女" "张楠" "女" end save mdata1, replace clear input str10 name2 str3 gender"王五" "男" "赵四" "男" "王琴" "女" "赵英" "女" end save mdata2, replace use mdata1, clear merge m :m gender using "mdata2"
可以看到,这个结果不是我们想要的。那么如何进行 m:m 的匹配呢?我们可以循环进行 m 次 1:m 的匹配或者 m 次 m:1 的匹配:
use mdata1, clear bysort gender: gen matchid = _nsave mdata1, replace forval i = 1/2 { use mdata1, clear keep if matchid == `i' merge 1:m gender using mdata2 save matchres`i' , replace } use matchres1, clear append using matchres2drop _m matchid
这样就得到了所有同性别的组合了。
那么我们现在如果想进行 m:m 的匹配也要这样做:
use ipcdf2.dta, clear bysort class : gen matchid = _nsave ipcdf2a, replace tab matchiduse data3, clear gen class = substr (分类号, 1, 4)save data3, replace forval i = 1/2 { use ipcdf2a.dta, clear keep if matchid == `i' merge 1:m class using data3 save matchres`i' , replace } use matchres1, clear append using matchres2keep if _m == 3keep zlid gqid class l1title l2title l3title l4titleren class greenIPCsave dfres2, replace
ipcdf3 和 ipcdf4 可以合并起来处理 ipcdf3 和 ipcdf4 都是具体的分类号,可以合并起来处理:
use ipcdf3, clear append using ipcdf4gen 分类号 = class + IPCorder 分类号duplicates report 分类号bysort 分类号: gen matchid = _ntab matchidsave ipcdf5, replace forval i = 1/4 { use ipcdf5.dta, clear keep if matchid == `i' merge 1:m 分类号 using data3 save matchres`i' , replace } use matchres1, clear forval i = 2/4 { append using matchres`i' } keep if _m == 3keep zlid gqid class l1title l2title l3title l4title l5titleren class greenIPCsave dfres5, replace
合并所有的结果 最后合并所有的结果就可以了:
use dfres1, clear append using dfres2append using dfres5save 基于分类号筛选的绿色专利.dta, replace
类似的方法就可以根据主分类号进行筛选了,而且更为简单(不需要拆分分类号了):
use gqzl2013sim, clear drop 分类号ren 主分类号 分类号save data2, replace use data2, clear replace 分类号 = ustrregexs(1) if ustrregexm(分类号, "(.*)\(" )drop if !index (分类号, "/" )save data3, replace use ipcdf1.dta, clear use data3, clear gen class = substr (分类号, 1, 3)merge m :1 class using ipcdf1.dtakeep if _m == 3keep zlid gqid class l1title l2titleren class greenIPCsave dfres1, replace use ipcdf2.dta, clear bysort class : gen matchid = _nsave ipcdf2a, replace tab matchiduse data3, clear gen class = substr (分类号, 1, 4)save data3, replace forval i = 1/2 { use ipcdf2a.dta, clear keep if matchid == `i' merge 1:m class using data3 save matchres`i' , replace } use matchres1, clear append using matchres2keep if _m == 3keep zlid gqid class l1title l2title l3title l4titleren class greenIPCsave dfres2, replace use ipcdf3, clear append using ipcdf4gen 分类号 = class + IPCorder 分类号duplicates report 分类号bysort 分类号: gen matchid = _ntab matchidsave ipcdf5, replace forval i = 1/4 { use ipcdf5.dta, clear keep if matchid == `i' merge 1:m 分类号 using data3 save matchres`i' , replace } use matchres1, clear forval i = 2/4 { append using matchres`i' } keep if _m == 3keep zlid gqid class l1title l2title l3title l4title l5titleren class greenIPCsave dfres5, replace use dfres1, clear append using dfres2append using dfres5save 基于主分类号筛选的绿色专利.dta, replace
然后我们就可以统计各种类型绿色专利的数量了。这里以“基于主分类号筛选的绿色专利.dta”为例:
use 基于主分类号筛选的绿色专利.dta, clear duplicates drop zlid gqid, forcemerge 1:1 zlid gqid using "工企专利匹配2013(完整版).dta" keep if _m == 3collapse (count ) zlid, by (gqid 专利类型)spread 专利类型 zlid ren 发明型专利 发明型绿色专利ren 实用型专利 实用型绿色专利gen 绿色专利数量 = 发明型绿色专利 + 实用型绿色专利replace 发明型绿色专利 = 0 if missing (发明型绿色专利)replace 实用型绿色专利 = 0 if missing (实用型绿色专利)replace 绿色专利数量 = 0 if missing (绿色专利数量)save "2013年各公司绿色专利数量" , replace use 工企专利数量2013.dta, clear merge 1:1 gqid using "2013年各公司绿色专利数量" order gqid 年份 设计型专利 发明型专利 实用型专利 总专利数量 发明型绿色专利 实用型绿色专利 绿色专利数量replace 发明型绿色专利 = 0 if missing (发明型绿色专利)replace 实用型绿色专利 = 0 if missing (实用型绿色专利)replace 绿色专利数量 = 0 if missing (绿色专利数量)save 工企绿色专利数量2013.dta, replace
最后删除掉所有的临时文件:
* 删去无用的文件 cap erase data1.dta cap erase data2.dta cap erase data3.dta cap erase dfres1.dta cap erase dfres5.dta cap erase dfres2.dta cap erase gqzl2013sim.dta cap erase ipcdf2a.dta cap erase matchres1.dta cap erase matchres2.dta cap erase matchres3.dta cap erase matchres4.dta cap erase mdata1.dta cap erase mdata2.dta cap erase temp.dta cap erase ipcdf5.dta
按照这个方法循环所有的年份即可。
点击这里跳转到 RStata 短书平台获取附件:使用 Stata 进行绿色专利的筛选
评论