我的数据集如下所示:
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
。感谢您的任何建议。
答案 0 :(得分:2)
这是一些技巧; 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 |
+----------------------+
答案 1 :(得分:1)
作为一个例子,您可以使用适当的排序和辅助变量到达那里:
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)
以这种方式思考可以在"指导" joinby
等命令不可用。