Stata 从长变长

Stata 从长变长,stata,reshape,Stata,Reshape,我正在尝试将Stata中的数据集重塑为长格式 然而,原始数据集已经是一个很长的格式,每个给定的个体都有多个观测值。每行包含给定学生在给定年份进行的所有测试 我想要的是每一行包含给定年份中特定测试的数据 例如,从该数据集中: +---------------------------------------------------------------------------+ | student_id | year | score_math | date_math | score_eng

我正在尝试将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)
接下来,为了“假装”我的数据很长(以便我能够重塑长数据),我使用了:

每次观察都有一个唯一的
新id
,然后我尝试:

reshape long score* date*, i(new_id) j(test_name)
这也不管用


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

以下内容产生所需输出:

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       .        |
     +----------------------------------------------+

请不要发布单独的图片
ssc inst dataex
提供一个命令,用于发布其他人可以复制和粘贴的数据集,以显示代码。请注意,
重塑long
不接受带有通配符的变量列表;它需要变量名存根。
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       .        |
     +----------------------------------------------+