长期重塑

时间:2017-02-23 22:12:36

标签: stata reshape

我正在尝试将Stata中的数据集重新整形为长格式。

但是,原始数据集已经是长格式,每个给定个体都有多个观察值。每行包含给定学生在给定年份内进行的所有测试。

我想要的是每行包含给定年份中特定测试的数据。

例如,从此数据集:

  +---------------------------------------------------------------------------+
  | student_id | year | score_math | date_math | score_english | date_english |
  |------------+------+------------+-----------+---------------+--------------|
  |        111 | 2011 |          . |           |             . |              |
  |        111 | 2013 |        259 |       apr |           250 |          apr |
  |        222 | 2012 |        645 |       mar |           645 |          mar |
  |        222 | 2014 |        640 |       dec |             . |              |
  |        333 | 2016 |          . |           |           358 |          apr |
  |        333 | 2017 |          . |           |           299 |          jan |
  +---------------------------------------------------------------------------+

我想得到以下一个:

  +----------------------------------------------+
  | student_id | year | test_name | score | date |
  |------------+------+-----------+-------+------|
  |        111 | 2011 |   english |     . |      |
  |        111 | 2011 |      math |     . |      |
  |        111 | 2013 |   english |   250 |  apr |
  |        111 | 2013 |      math |   259 |  apr |
  |        222 | 2012 |   english |   645 |  mar |
  |        222 | 2012 |      math |   645 |  mar |
  |        222 | 2014 |   english |     . |      |
  |        222 | 2014 |      math |   640 |  dec |
  |        333 | 2016 |   english |   358 |  apr |
  |        333 | 2016 |      math |     . |      |
  |        333 | 2017 |   english |   299 |  jan |
  |        333 | 2017 |      math |     . |      |
  +----------------------------------------------+

我已尝试运行以下命令但由于数据很长而无效:

reshape long score* date*, i(student_id) j(test_name)

我得到的是以下信息:

  

变量test_name包含所有缺失值

所以我试着改为:

reshape wide score* date*, i(student_id) j(year)

接下来,假装'我的数据很长(所以我能够重塑很长时间)我用过:

egen new_id = group(student_id year)

每次观察后都有一个独特的new_id,然后我尝试了:

reshape long score* date*, i(new_id) j(test_name)

这也不起作用。

关于如何获得所需输出的任何建议?

1 个答案:

答案 0 :(得分:2)

以下将产生所需的输出:

clear

input student_id year score_math str3 date_math score_english str3 date_english
111 2011 . " " . " "
111 2013 259 "apr" 250 "apr"
222 2012 645 "mar" 645 "mar"
222 2014 640 "dec" . " "
333 2016 . " " 358 "apr"
333 2017 . " " 299 "jan"
end

reshape long score_ date_, i(student_id year) j(test_name) string
rename *_ *

list, sepby(student_id) abbreviate(30)

     +----------------------------------------------+
     | student_id   year   test_name   score   date |
     |----------------------------------------------|
  1. |        111   2011     english       .        |
  2. |        111   2011        math       .        |
  3. |        111   2013     english     250    apr |
  4. |        111   2013        math     259    apr |
     |----------------------------------------------|
  5. |        222   2012     english     645    mar |
  6. |        222   2012        math     645    mar |
  7. |        222   2014     english       .        |
  8. |        222   2014        math     640    dec |
     |----------------------------------------------|
  9. |        333   2016     english     358    apr |
 10. |        333   2016        math       .        |
 11. |        333   2017     english     299    jan |
 12. |        333   2017        math       .        |
     +----------------------------------------------+