Stata中的移动观测

Stata中的移动观测,stata,Stata,如果缺少值,我想将观察值向左移动。例如,如果我有 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 .

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

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

我不想重塑数据。我的数据太大。

这适用于您的示例:

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        |
     +---------------------------------------------------------------------+
编辑:在旧变量旁边创建新变量。然后由您决定是否删除旧的
和重命名新的

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

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

  • 在内存和速度方面,该方法与第一次基于
    长整形
    的方法进行了比较(如果认为原始布局至关重要,则为最终的
    宽整形
    )。一个比较可能以OP的数据集为特征(以及其他形式相似但大小不同的数据集,因为在这里发布的要点是其他人可能有类似的问题)

  • 人们似乎经常抱怨
    重塑
    的速度,但抛开猜测和流言蜚语不谈,证据会很有趣

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