配套视频、笔记与代码

  将竖向的列变为横向的行,即为“长转宽”;将横的行变为竖向的列,即为“宽转长”。在 Stata 中,通过 reshape 命令可以实现长宽数据转换。

一、基本语法

1
2
3
4
5
6
7
8
9
10
11
12
13
** 宽数据转化为长数据 (wide to long)
reshape long stubnames, i(varlist) [options]

** 长数据转化为宽数据 (long to wide)
reshape wide stubnames, i(varlist) [options]

** 长宽数据转换失败时,列出转换失败的样本
reshape error

/* Note: stubnames 表示变量前缀名;
i(varlist): varlist 是宽数据中可以唯一识别每组样本的变量,如家庭数据中的家庭编码;
j(varlist): varlist 是在长数据中,根据宽数据唯一识别码的分组后,每组中每个样本的识别码,如家庭成员数据中的成员顺序码;
string: 长宽数据转换时,j(varlist) 中的 varlist 不是数值时,需要使用string;不特别指定,默认是数值。 */

二、示例

1
2
3
4
5
6
7
** wide to long (宽数据转化为长数据)
reshape long X1 X2,i(ID) j(list) string
** Note: 每个样本的唯一识别码是ID,需要转换的变量是X1*、X2*(星号表示通配符),可将X1_1 X1_2转换为X1,并将"_1"和"_2"作为新生成变量list的值,list不是数值型,因此需要加上string选项

** long to wide (长数据转化为宽数据)
reshape wide X1 X2,i(ID) j(list) string
** Note: 转换为宽数据后,ID应作为唯一识别码,需要将X1、X2转换为X1*、X2*,其中*是对应list的取值。若list不是数值型,应当加上strin

  组合命令示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
** wide to long
reshape long X1,i(ID) j(list) string //将X1_1 ~ X1_5转化为长数据
** 将list转为数值型(方法一)
forvalues i=1/5 {
replace list="`i'" if list=="_`i'"
}
destring list,replace
** 将list转为数值型(方法二)
destring list,i(_) replace //i(_)表示忽略下划线,将其他数字转换为数值型。
/* Note: 转换结果 —— X1,list取值为1~5。*/

** long to wide
** 将list转为字符型
tostring list,replace
forvalues i=1/5 {
replace list="`i'" if list=="_`i'"
}
reshape wide X1,i(ID) j(list) string
/* Note: 转换结果:X1_1 X1_2 X1_3 X1_4 X1_5。*/

三、图示

(⚠️注意:不同设备的显示字体不同,可能会出现字符错位的现象。将错位的文本复制到其他文本编辑器 / Stata do 文件编辑器中,可以解决此问题。)

1
2
3
4
5
6
7
8
9
10
11
/* reshape 示例:
long data
+------------+ wide data
| i j x | +---------------------+
|------------| | i x1 x2 x3 |
| 1 1 4.1 | reshape |---------------------|
| 1 2 4.5 | <---------> | 1 4.1 4.5 . |
| 2 1 3.3 | | 2 3.3 3.0 5.5 |
| 2 2 3.0 | +---------------------+
| 2 3 5.5 |
+------------+ */

  常见情况:

  家庭数据中,家庭编码 ID 可以唯一识别每一个家庭样本,每个家庭成员在家庭内有唯一顺序码 list,用家庭编码 ID 和家庭内顺序码 list 可以唯一识别每个家庭成员。

  ‍