【问题标题】:shifting observations in Stata在Stata中改变观察
【发布时间】:2021-03-31 05:57:35
【问题描述】:

如果有缺失值,我想将观察结果向左移动。例如,如果我有

num1 num2 num3 num4 num5 num6
1    2    .    2    4    .
.    .    .    3    4    4
.    .    3    4    1    .
.    2    .    2    1    .

我想把它们移过来:

num1 num2 num3 num4 num5 num6
1    2    2    4    .    .
3    4    4    .    .    .
3    4    1    .    .    .
2    2    1    .    .    .

我不想reshape 数据。我的数据太大了。

【问题讨论】:

    标签: stata


    【解决方案1】:

    这适用于您的示例:

    clear
    input num1 num2 num3 num4 num5 num6
    1    2    .    2    4    .
    .    .    .    3    4    4
    .    .    3    4    1    .
    .    2    .    2    1    .
    end 
    
    egen all = concat(num*) 
    replace all = subinstr(all, ".", "", .) 
    compress all 
    
    count if all != "" 
    local j = 1 
    quietly while r(N) > 0 { 
        gen NUM`j' = real( substr(all, 1, 1) )
        replace all = substr(all, 2, .) 
        local ++j
        count if all != "" 
    } 
    
    drop all 
    list num* NUM*  
        
         +---------------------------------------------------------------------+
         | num1   num2   num3   num4   num5   num6   NUM1   NUM2   NUM3   NUM4 |
         |---------------------------------------------------------------------|
      1. |    1      2      .      2      4      .      1      2      2      4 |
      2. |    .      .      .      3      4      4      3      4      4        |
      3. |    .      .      3      4      1      .      3      4      1        |
      4. |    .      2      .      2      1      .      2      2      1        |
         +---------------------------------------------------------------------+
    

    编辑:这会在旧变量旁边创建新变量。然后由您决定是否使用旧的drop 和新的rename

    除了您的示例之外,该主题还提出了各种问题,包括

    1. 您的数据布局(有人说是结构或格式)是否适合您的目的。例如,如果您的数据集确实是面板或纵向数据,那么在 Stata 中通常更可取的是长布局。为此,您需要reshape long

    2. 此方法的内存和速度方面的比较与第一个基于reshape long 的方法(如果原始布局被认为是必要的,则为最终的reshape wide)。比较可能以 OP 的数据集为特征(以及其他类似形式但大小不同的数据集,因为此处发布的主要目的是其他人可能有类似的问题)。

    人们似乎经常抱怨reshape 的速度,但抛开猜测和八卦,证据会很有趣。

    编辑 2020 年 3 月 30 日,我建议这是一个更好的解决方案。

    clear
    input num1 num2 num3 num4 num5 num6
    1    2    .    2    4    .
    .    .    .    3    4    4
    .    .    3    4    1    .
    .    2    .    2    1    .
    end 
    
    egen NUM = concat(num?), p(" ")
    replace NUM = subinstr(NUM, ".", "", .)
    split NUM, destring 
    
    list NUM? 
    
         +---------------------------+
         | NUM1   NUM2   NUM3   NUM4 |
         |---------------------------|
      1. |    1      2      2      4 |
      2. |    3      4      4      . |
      3. |    3      4      1      . |
      4. |    2      2      1      . |
         +---------------------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      相关资源
      最近更新 更多