gen的再进化
本文作者:朱巧利
文字编辑:张馨月
导读
gen是我们在Stata中使用非常频繁的命令,它可以用来生成新的变量或跟随计算表达式,但仍然不能满足我们的需求。egen作为gen的扩展和深入,可以与多种函数组合使用,在往期系列推文《论egen的花样用法(一)》、《论egen的花样用法(二)》、《论egen的花样用法(三)》中已经进行详细介绍。
虽然egen的用法已经很丰富了,但是它再一次进化了,这就是今天的主角——egenmore,它进一步丰富了egen的函数库,在文字处理方面的功能也大幅提高,在推文《egenmore隐藏功能——进制转换》中介绍过它的进制转换功能,今天小编就和大家一起来看看egenmore关于文字处理方面的一些其他用法。
egenmore的基本语法与egen相同:
egen [type] newvar = fcn(arguments) [if exp] [in range] [, options]
egenmore可简写为egen,可见两者本质相同。
(一)egenmore与incss
incss(strvarlist), substr(substring) [ insensitive ]
incss用来寻找哪些变量含有我们想要的字符串,如果字符串变量列表(strvarlist)中任何一个变量内含有指定的子字符串(substring),则生成1,否则为0,其中insensitive选项表示不区分大小写。需要注意的是我们可以指定多个子字符串,但这些字符串是有顺序的。
举例如下:
clear //输入数据
input str20 v
"i love stata"
"i like python"
"Stata and python"
end
如果我们想要找到含有stata的变量,程序如下:
egen stata = incss(v),sub(stata) i //不区分大小写
结果如下:
可以看到含有stata的变量为1,否则为0。
msub(strvar), find(findstr) [replace(replacestr) n(#) word]
findstr和replacestr的单词由空格分隔或由“”绑定,即find(a b“c d”)包含三个单词,依次为“a”、“b”和“c d”,并且应该使用双引号“”来分隔任何包含一个或多个空格的单词。
findstr中的单词数应该等于replacestr中的单词数,但有如下两点需注意:
(1)可使用空的replacestr来指定删除;
(2) replacestr中只有单个单词表示findstr中的每个单词都将被该单词替换。
由于使用引号进行分隔,文字引号应包含在复合双引号中,如' " " "';默认情况下,所有findstr的单词都会改变,n(#)指定只更改前#次出现的单词;word指定只有在findstr中的单词作为单独的单词出现在strvar中时才替换它们。msub()的替换是按顺序进行的,其功能的实现依赖于内置函数subinstr()和subinword()。
举例如下:
clear
input str20 str
"A AB BAC"
"B A BCA"
end
egen newstr = msub(str), f(A B C) r(1 2 3) //A被1替换,B被2替换,C被3替换
egen newstr1 = msub(str), f(A B C) r(1 2 3) n(1) //只更改第一次出现的A、B、C
egen newstr2 = msub(str), f(A B C) r(1) //A、B、C全部被1替换
egen newstr3 = msub(str), f(A B) //A、B被删除
egen newstr4 = msub(str), f(" ") //空格被删除
egen newstr5 = msub(str), f(A) w //A单独作为一个单词时会被删除
结果如下:
(三)egenmore与ntos
ntos(numvar), from(numlist) to(list of string values)
表示从一个数值型变量numvar生成一个字符型变量,将numlist中的每个数值映射到对应的字符串。需要注意每个列表中的元素数量必须相同,包含空格的字符串值应该用双引号“”分隔。没有被映射定义的值会生成为缺失值。
举例如下:
clear
input Grade
1
2
3
4
5
end
egen grade = ntos(Grade), from(1/5) to(Poor Fair Good "Very good" Excellent)
结果如下:
可以看到不同的数字都映射到了相应的字符串。ntos()函数的逆函数是ston(),ston()可以将相应的字符串映射为数字。
(四)egenmore与repeat
repeat(), values(value_list) [ by(byvarlist) block(#) ]
生成一个重复的value_list序列。value_list的可以是一个数字列表,也可以是一组字符串值,它们被循环地分配给连续的观察值。block()应该以指定大小的块重复,默认值为1。
举例如下:
clear
set obs 12
egen quarter1 = repeat(), v(1/4)
egen quarter2 = repeat(), v(1/4) block(3)
egen months = repeat(), v(`c(Months)')
egen levels = repeat(), v(10 50 200 500)
结果如下:
从上面的介绍可以看到egenmore关于文字处理方面的功能还是很丰富的,除了本文介绍的几种外还有非常多的用法,大家赶紧探索起来吧!
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。