使用 Stata 处理文献计量数据

最近有小伙伴问到如何使用 Stata 处理一份这样的数据:

每个 PT J 行开头的都是一段文献数据:

然后需要将前两个字母作为变量名,将该数据整理成变量表的形式。

下面我们来一步步处理:

首先把数据读取为一个变量 v,提取前两个字符生成 v1:

infix strL v 1-10000 using "download2010u895.txt", clear
gen v1 = ustrregexs(0) if ustrregexm(v, "^[A-Z]{2}")
replace v = subinstr(v, v1, "", 1)
order v1 v

每个“PT”开头的都是一段文献计量数据,所以我们可以生成一个变量标识下:

gen v2 = _n if v1 == "PT"
*- ssc install fillmissing
fillmissing v2, with(previous)
fillmissing v1, with(previous)

这样 v2 取不同值对应的就是不同的文献计量数据。下面我们还需要解决一个问题,就是例如 “AU” 字段对应了多个作者,我们需要把这些作者合并到一个格子里面。常用的方法就是先把数据转换成宽数据,合并同字段的变量。

为了达成这部分目标,我们需要首先生成一个 v3 作为转换成宽数据之后的变量名:

gen id = _n
bysort v1 v2: gen v3 = _n
gsort id
tostring v3, replace
replace v3 = "m" + v3
drop id
replace v = strtrim(v)
*- ssc install tidy
spread v3 v
gsort v2

这里的 id 变量仅仅是帮助排序的,所以用完就删除了。

对 m 开头的变量排个序,方便观察:

local vlist = "m1"
forval i = 2/86 {
local vlist `vlist' m`i'
}
di "`vlist'"
order v1 v2 `vlist'

合并 m 开头的变量,这里为了便于和数据里面的单词间空格区分,我使用了 5 个连续的空格作为分隔符(当然 4 个也行,随意):

unite m*, gen(value) sep("     ")
drop m*

使用 strtrim() 函数可以去除 value 变量前后多余的空格,然后再把内部的“5个连续空格”替换成“~”:

replace value = strtrim(value)
replace value = subinstr(value, " ", "~", .)

然后我们再次把这个数据进行长转宽:

spread v1 value
gsort v2

最后再稍作处理,这份数据我们就处理好了:

order v2 PT AU AF TI SO LA DT DE ID AB RP EM FU CR BU FI HO IK NR TC PU PI PA SN EI JI PD PY VL IS BP EP DI PG WC SC GA UT PM DA ER
drop v2
gen id = _n
order id

save result, replace

点击这里跳转到 RStata 短书平台获取附件:使用 Stata 处理文献计量数据

评论