NO.4 基于Stata的数据清洗

c8ea15ce36d3d539563f400a3a87e950342ab0fd

字符串的处理


字符型与数值型数据的转换:字符类型的转换命令tostring/destring已经在之前讲过,这里不再赘述。
字符分列split,与excel的分列一样split命令可以以特定字符将数据分开。以自带数据集auto为例,auto的原始数据,make变量的值是由汽车厂商(make)和型号(model)两个信息组成的:

我们可以用split命令将这两个信息分成两列:

split make ;split命令默认以空格分隔数据
或者输入:
split make , p(" ") ;参数p指定用来分隔的字符,注意用引号,可以指定多个字符

输入命令后,可以看到make变量被分成了make1,make2,make3 三列,我们将make2和make3的数据合并,并命名为model:

gen model=make2+" " +make3 if make3!="";新建model,如果make3不为空,变量其值为make2+空格+make3
replace model=make2 if model==""; 替换model的空值为make2
drop make2 make3; 删除make2 make3

字符串提取substr命令,其使用示例如下:

substr(s,n1,n2);从第n1个字符开始提取s的n2个字符
substr("abcdef",2,3)="bcd";从第二个字符开始提取,提取三个字符
substr("abcdef",-3,2)="de";从倒数第三个字符开始提取,提取两个字符
substr("abcdef",2,.)="bcdef";从第二个字符开始,提取之后的所有字符
substr("abcdef",-3,.)="def";地倒数第三个字符开始,提取之后的所有字符

字符替换subinstr命令,其实使用示例如下:

subinstr(s1,s2,s3,n);将s1中的n个s2替换成s3
subinstr("this is this","is","X",1)="thX is this"
subinstr("this is this","is","X",2)="thX X this"
subinstr("this is this","is","X",.)="thX X thX"

通用字符:和excel一样*?为通用字符,分别代表匹配多个字符和匹配一个字符。常用于字符查找中。
查找字符串strmatch命令,其命令形式:

strmatch(s1,s2);返回值为0和1,1代表有匹配,0代表没有匹配。

数据分类


不同情况下的数据分类方法:
判断变量
以自带数据集auto为例,我们将价格大于5000和小于5000的分为两类:

sysuse auto;加载auto数据集
gen n1=(price>5000);新建判断变量n1,满足条件返回1,不满足返回0
label define p1 1"贵" 0"便宜";新建标签定义p1
label value n1 p1; 为判断变量n1赋予标签定义p1

分类变量

  1. generatereplace结合if语句新建分类变量,这里不再赘述。
  2. recode命令,其命令形式:

    recode varlist (rule) [(rule) ...] [, generate(newvar)]
    

    以自带数据集auto为例,我们按价格5000和10000将其分为三类:

    recode price (1/5000=1) (5000/10000=2) (10000/20000=3) ,gen(n2); 以1~5000、5000~10000、10000~20000的价格区间建立分类变量n2
    label define p2 1"便宜" 2"贵" 3"很贵";新建标签定义p2
    label value n2 p2
  3. group命令,group命令将会按样本数量将数据均分成若干个组:

    gen n3=group(5);将数据集均分成5组
    
  4. autocode命令,autocode命令将会以规定的值域来分成等间距的n组,
    其命令形式为:

    autocode(x,n,x0,x1)
    x:分类所用的值
    n:分成n等分
    x0:最小取值
    X1:最大取值

    以auto数据集为例,将数据以price从低到高的顺序分成五组:

    codebook price;查看price变量的信息,可以看到其取值范围是[3291,15906]
    gen n4=autocode(price,5,3291,15906);以price的值域均分成五组
    

数据合并


横向合并
横向合并是以一个相同变量为参考合并两个数据,表现在表格中即表格列数增加
如数据一:

id name gender
1 Alex female
2 Bob male

和数据二:

id score
1 80
2 85

以id为参考横向合并的数据就是:

id name gender score
1 Alex female 80
2 Bob male 85

横向合并命令:

 merge 1:1 var using data2
 1:1 :一对一合并
 var:参考变量
 data2:需合并的另一个数据
 merge命令可以完美替代excel中的vlookup函数

纵向合并
纵向合并是两个有相同变量的数据的合并,表现在表格中即表格行数的增加。
如数据一:

id name gender score
1 Alex female 80

数据二:

id name gender score
2 Bob male 85

它们纵向合并的结果就是:

id name gender score
1 Alex female 80
2 Bob male 85

纵向合并命令:

append using data2; data2:需合并的另一个数据

交叉合并
交叉合并是一个数据变量的每一个值与另一个数据变量的每一个值交叉。
如数据一:

gender
female
male

数据二:

age
20
30

其交叉合并的结果为:

gender age
female 20
female 30
male 20
male 30

交叉合并命令:

crossing using data2; data2:需合并的另一个数据

组内交叉合并
在两个数据都有分组的情况下,每组的数据进行交叉合并,即为组内交叉合并。
如数据一:

group gender
1 female
1 male
2 female
2 male

数据二:

group age
1 20
1 25
2 30
2 35

其组内交叉合并的结果为:

group gender age
1 female 20
1 female 25
1 male 20
1 male 25
2 female 30
2 female 35
2 male 30
2 male 35

组内交叉命令:

joinby [var] using data2
var:分组参照
data2:需要合并的另一个数据

命令整理


  • tostringdestringsplitsubstrsubinstrstrmatch
  • recodegroupautocode
  • mergeappendcrossjoinby
  • codebook

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google photo

You are commenting using your Google account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s