数据扩展,以便创建两个协变量的所有可能组合

时间:2015-12-13 00:05:20

标签: stata expand

我的数据集如下所示:

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。感谢您的任何建议。

2 个答案:

答案 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)

@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)

以这种方式思考可以在"指导" joinby等命令不可用。