无标识符从长到长重塑

时间:2016-08-13 17:56:03

标签: stata long-integer reshape

我在从宽到长格式重塑数据时遇到问题:

  1. 我没有宽变量的标识符变量。
  2. 我的数据集非常广泛。我确实有大约7000个变量。
  3. 每个ID的变量数量不是常数,因此对于某些ID我有5个而其他ID我有10个变量。
  4. 我希望这个Stata FAQ可以帮助我,但不幸的是,这不能正常工作(请参阅下面的代码片段)。

    所以我的数据看起来像下面的例子:

    clear
    input str45 Year
    "2010"
    "2011"
    "2012"
    "2014"
    end
    input str45 A101Meas0010
    "1.50"
    "1.70"
    "1.71"
    "1.71"
    input str45 A101Meas0020
    "50"
    "60"
    "65"
    "64"
    input str45 A101Meas0020A
    "51"
    "62"
    "64"
    "68"
    input str45 FE123Meas0010
    "1.60"
    "1.75"
    "1.92"
    "1.94"
    input str45 FE123Meas0020
    "60"
    "72"
    "88"
    "92"
    list
    
         +-------------------------------------------------------------+
         | Year   A10~0010   A10~0020   A1~0020A   FE1~0010   FE1~0020 |
         |-------------------------------------------------------------|
      1. | 2010       1.50         50         51       1.60         60 |
      2. | 2011       1.70         60         62       1.75         72 |
      3. | 2012       1.71         65         64       1.92         88 |
      4. | 2014       1.71         64         68       1.94         92 |
         +-------------------------------------------------------------+
    

    我想要实现的决赛桌看起来像这样:

         +--------------------------------------------------+
         | Year         ID   Meas0010   Meas0020  Meas0020A |
         |--------------------------------------------------|
      1. | 2010       A101       1.50         50          . |
      2. | 2010      FE123       1.60         51         60 |
      3. | 2011       A101       1.70         60          . |
      4. | 2011      FE123       1.75         62         72 |
      5. | 2012       A101       1.71         65          . |
      6. | 2012      FE123       1.92         64         88 |
      7. | 2014       A101       1.71         64          . |
      8. | 2014      FE123       1.94         68         92 |
         +--------------------------------------------------+
    

    我尝试使用Stata常见问题解答中的示例附近的代码段,但这会引发错误:

    unab vars : *Meas*
    local stubs : subinstr local vars  "Meas0010" "", all
    local stubs : subinstr local stubs "Meas0020" "", all
    local stubs : subinstr local stubs "Meas0020A" "", all
    reshape long "`stubs'", i(Year) j(Measurement) string
    (note: j = Meas0010 Meas0020 Meas0020A)
    (note: A101AMeas0010 not found)
    variable A101Meas0010 not found
    r(111);
    

    任何想法如何重塑这个?我以前从来没有必要重塑这种奇怪的结构。

    附加问题:在上面的示例中,我确实需要指定度量名称Meas0010Meas0020Meas0020A。是否有可能实现自动化?所有度量名称都以关键字Meas开头,因此变量名称始终为_ID + Meas Name 结构,例如A101Meas0020A代表身份A101和衡量Meas0020A

    令人烦恼的是:我确实知道如何在MATLAB中执行此操作,但我不得不在这里使用Stata。

1 个答案:

答案 0 :(得分:1)

您的变量名称结构有点尴尬,但有一个匹配的语法。在reshape的帮助中更好地介绍了它,并且在你引用的常见问题中几乎没有提到(我写的,所以我可以强调它是作为帮助的补充,而不是第一行文档) 。

你的例子屈服于

clear
input str4 (Year  A101Meas0010  A101Meas0020  A101Meas0020A  FE123Meas0010  FE123Meas0020)  
"2010" "1.50" "50" "51" "1.60" "50"
"2011" "1.70" "60" "62" "1.75" "60"
"2012" "1.71" "65" "64" "1.92" "65"
"2014" "1.71" "64" "68" "1.94" "64"
end
reshape long @Meas0010 @Meas0020 @Meas0020A, i(Year) j(ID) string 
destring, replace 
sort Year ID 
list, sepby(Year) 


     +-----------------------------------------------+
     | Year      ID   Meas0010   Meas0020   Me~0020A |
     |-----------------------------------------------|
  1. | 2010    A101        1.5         50         51 |
  2. | 2010   FE123        1.6         50          . |
     |-----------------------------------------------|
  3. | 2011    A101        1.7         60         62 |
  4. | 2011   FE123       1.75         60          . |
     |-----------------------------------------------|
  5. | 2012    A101       1.71         65         64 |
  6. | 2012   FE123       1.92         65          . |
     |-----------------------------------------------|
  7. | 2014    A101       1.71         64         68 |
  8. | 2014   FE123       1.94         64          . |
     +-----------------------------------------------+

您的示例以字符串形式输入所有内容似乎很奇怪:请注意代码中的destring

如果不访问您的数据集,我会说您应该能够在没有自动化的情况下找到更通用的语法。您知道最完整的情况下最多只有10次测量。无论如何,您已经显示了删除不需要的字符串所需的语法技巧。