数据扩展以创建两个协变量的所有可能组合
Data expansion so to create all possible combinations of two covariates
我的数据集如下所示:
clear all
input id year x
1 1992 1
1 1995 5
1 1996 7
2 1992 2
2 1993 4
end
我需要根据 id
特定的观察数量扩展数据集,并创建以下数据结构,然后用于进一步计算(基本上,对于每个 id
-year
值的组合我必须重复初始的 year
值集):
id year y2 x
1 1992 1992 1
1 1992 1995 1
1 1992 1996 1
1 1995 1992 5
1 1995 1995 5
1 1995 1996 5
1 1996 1992 7
1 1996 1995 7
1 1996 1996 7
2 1992 1992 2
2 1992 1993 2
2 1993 1992 4
2 1993 1993 4
扩展很容易获得:
bysort id: gen N = _N
expand n_obs, gen(expanded)
然而,也许问题是微不足道的,但我找不到合适的策略来获得y2
。感谢您的任何建议。
这是一些技巧; joinby
是关键。由于您随后编辑了您的问题以包含变量 x,因此我编辑了此回复以在要连接到原始文件的文件中仅保留 id 和 y2。
// setup test data
clear all
input id year x
1 1992 1
1 1995 5
1 1996 7
2 1992 2
2 1993 4
end
tempfile t1
save `t1'
clear
// do the job
use `t1'
rename year y2
keep id y2
joinby id using `t1'
order id year y2
sort id year y2
list, sepby(id)
这给了我们
+----------------------+
| id year y2 x |
|----------------------|
1. | 1 1992 1992 1 |
2. | 1 1992 1995 1 |
3. | 1 1992 1996 1 |
4. | 1 1995 1992 5 |
5. | 1 1995 1995 5 |
6. | 1 1995 1996 5 |
7. | 1 1996 1992 7 |
8. | 1 1996 1995 7 |
9. | 1 1996 1996 7 |
|----------------------|
10. | 2 1992 1992 2 |
11. | 2 1992 1993 2 |
12. | 2 1993 1992 4 |
13. | 2 1993 1993 4 |
+----------------------+
@William 已经指出了直截了当的方法。
作为示例,您可以通过适当的排序和辅助变量到达那里:
clear
set more off
*----- example data -----
input ///
id year
1 1992
1 1995
1 1996
2 1992
2 1993
end
list, sepby(id)
*----- what you want -----
bysort id : gen N = _N
expand N
bysort id (year) : gen n = mod(_n-1, N) + 1
bysort id n (year) : gen year2 = year[n]
rename (year2 year) (year year2)
// pretty print
order id year year2
list, sepby(id)
当 "direct" 命令(例如 joinby
不可用时,以这种方式思考会有所帮助。
我的数据集如下所示:
clear all
input id year x
1 1992 1
1 1995 5
1 1996 7
2 1992 2
2 1993 4
end
我需要根据 id
特定的观察数量扩展数据集,并创建以下数据结构,然后用于进一步计算(基本上,对于每个 id
-year
值的组合我必须重复初始的 year
值集):
id year y2 x
1 1992 1992 1
1 1992 1995 1
1 1992 1996 1
1 1995 1992 5
1 1995 1995 5
1 1995 1996 5
1 1996 1992 7
1 1996 1995 7
1 1996 1996 7
2 1992 1992 2
2 1992 1993 2
2 1993 1992 4
2 1993 1993 4
扩展很容易获得:
bysort id: gen N = _N
expand n_obs, gen(expanded)
然而,也许问题是微不足道的,但我找不到合适的策略来获得y2
。感谢您的任何建议。
这是一些技巧; joinby
是关键。由于您随后编辑了您的问题以包含变量 x,因此我编辑了此回复以在要连接到原始文件的文件中仅保留 id 和 y2。
// setup test data
clear all
input id year x
1 1992 1
1 1995 5
1 1996 7
2 1992 2
2 1993 4
end
tempfile t1
save `t1'
clear
// do the job
use `t1'
rename year y2
keep id y2
joinby id using `t1'
order id year y2
sort id year y2
list, sepby(id)
这给了我们
+----------------------+
| id year y2 x |
|----------------------|
1. | 1 1992 1992 1 |
2. | 1 1992 1995 1 |
3. | 1 1992 1996 1 |
4. | 1 1995 1992 5 |
5. | 1 1995 1995 5 |
6. | 1 1995 1996 5 |
7. | 1 1996 1992 7 |
8. | 1 1996 1995 7 |
9. | 1 1996 1996 7 |
|----------------------|
10. | 2 1992 1992 2 |
11. | 2 1992 1993 2 |
12. | 2 1993 1992 4 |
13. | 2 1993 1993 4 |
+----------------------+
@William 已经指出了直截了当的方法。
作为示例,您可以通过适当的排序和辅助变量到达那里:
clear
set more off
*----- example data -----
input ///
id year
1 1992
1 1995
1 1996
2 1992
2 1993
end
list, sepby(id)
*----- what you want -----
bysort id : gen N = _N
expand N
bysort id (year) : gen n = mod(_n-1, N) + 1
bysort id n (year) : gen year2 = year[n]
rename (year2 year) (year year2)
// pretty print
order id year year2
list, sepby(id)
当 "direct" 命令(例如 joinby
不可用时,以这种方式思考会有所帮助。