Stata 按行捕获非缺失值并将其存储在新变量中

Stata 按行捕获非缺失值并将其存储在新变量中,stata,stata-macros,Stata,Stata Macros,我的数据集包含多个变量,称为avar_1到bvar_10,涉及个人的历史。由于某些原因,历史记录并不总是完整的,并且存在一些“缺口”(例如,avar_1和avar_4不缺失,但avar_2和avar_3缺失)。对于每个个体,我想将第一个非缺失值存储在名为var1的新变量中,第二个非缺失值存储在var2等中,这样我就有了一个没有缺失值的历史记录 我尝试了以下代码 local x=1 foreach wave in a b { forval i=1/10 { capture

我的数据集包含多个变量,称为
avar_1
bvar_10
,涉及个人的历史。由于某些原因,历史记录并不总是完整的,并且存在一些“缺口”(例如,
avar_1
avar_4
不缺失,但
avar_2
avar_3
缺失)。对于每个个体,我想将第一个非缺失值存储在名为
var1
的新变量中,第二个非缺失值存储在
var2
等中,这样我就有了一个没有缺失值的历史记录

我尝试了以下代码

local x=1
foreach wave in a b {
    forval i=1/10 {
        capture drop var`x' 
        generate var`x'=.
        capture replace var`x'=`wave'var`i' if !mi(`wave'`var'`i')
        if (!mi(var`x')) {
            local x=1+`x'
            }
    }
}
var1
正确生成,但
var2
仅包含缺失,且未生成以下变量。但是,我
将trace设置为on
,并看到
var2
实际上被替换为
avar_1
bvar_10
的所有变量

我的猜测是,
local x
在整个数据集的值发生变化时没有正确更新,但每个观测值应该不同


这就是问题所在吗?如果是的话,我该如何避免它?

一个简洁具体的数据示例比一个冗长的解释更有价值。您的描述似乎与以下示例一致:

* Example generated by -dataex-. To install: ssc install dataex
clear
input str1 id float(avar_1 avar_2 avar_3 bvar_1 bvar_2)
"A" 1 . 6 8 10
"B" 2 4 . 9  .
"C" 3 5 7 . 11
end

* 4 is specific to this example. 
rename (bvar_*) (avar_#), renumber(4)

reshape long avar_, i(id) j(which)
(note: j = 1 2 3 4 5)

Data                               wide   ->   long
-----------------------------------------------------------------------------
Number of obs.                        3   ->      15
Number of variables                   6   ->       3
j variable (5 values)                     ->   which
xij variables:
               avar_1 avar_2 ... avar_5   ->   avar_
-----------------------------------------------------------------------------

drop if missing(avar_)
bysort id (which) : replace which = _n
list, sepby(id)

     +--------------------+
     | id   which   avar_ |
     |--------------------|
  1. |  A       1       1 |
  2. |  A       2       6 |
  3. |  A       3       8 |
  4. |  A       4      10 |
     |--------------------|
  5. |  B       1       2 |
  6. |  B       2       4 |
  7. |  B       3       9 |
     |--------------------|
  8. |  C       1       3 |
  9. |  C       2       5 |
 10. |  C       3       7 |
 11. |  C       4      11 |
     +--------------------+
积极的方面:

!mi(var`x')
您的数据布局需要通过
重命名
,尤其是
长形重塑
提供某种结构。我在这里不提供宽度重塑的代码,因为对于绝大多数Stata目的,您最好使用此布局

负面观点:

!mi(var`x')
返回是否缺少变量的第一个值。如果
foo
是数据集中的一个变量,
!mi(foo)
被评估为
!mi(foo[1])
。这不是你想要的。有关完整的故事,请参阅


我建议使用更具启发性的变量名。

一个简洁具体的数据示例比一个冗长的解释更值得。您的描述似乎与以下示例一致:

* Example generated by -dataex-. To install: ssc install dataex
clear
input str1 id float(avar_1 avar_2 avar_3 bvar_1 bvar_2)
"A" 1 . 6 8 10
"B" 2 4 . 9  .
"C" 3 5 7 . 11
end

* 4 is specific to this example. 
rename (bvar_*) (avar_#), renumber(4)

reshape long avar_, i(id) j(which)
(note: j = 1 2 3 4 5)

Data                               wide   ->   long
-----------------------------------------------------------------------------
Number of obs.                        3   ->      15
Number of variables                   6   ->       3
j variable (5 values)                     ->   which
xij variables:
               avar_1 avar_2 ... avar_5   ->   avar_
-----------------------------------------------------------------------------

drop if missing(avar_)
bysort id (which) : replace which = _n
list, sepby(id)

     +--------------------+
     | id   which   avar_ |
     |--------------------|
  1. |  A       1       1 |
  2. |  A       2       6 |
  3. |  A       3       8 |
  4. |  A       4      10 |
     |--------------------|
  5. |  B       1       2 |
  6. |  B       2       4 |
  7. |  B       3       9 |
     |--------------------|
  8. |  C       1       3 |
  9. |  C       2       5 |
 10. |  C       3       7 |
 11. |  C       4      11 |
     +--------------------+
积极的方面:

!mi(var`x')
您的数据布局需要通过
重命名
,尤其是
长形重塑
提供某种结构。我在这里不提供宽度重塑的代码,因为对于绝大多数Stata目的,您最好使用此布局

负面观点:

!mi(var`x')
返回是否缺少变量的第一个值。如果
foo
是数据集中的一个变量,
!mi(foo)
被评估为
!mi(foo[1])
。这不是你想要的。有关完整的故事,请参阅


我建议使用更具启发性的变量名。

在您的问题中,下划线
\uu
是否是变量名的一部分以及它们出现的位置有些不一致。我在编辑时假设真实数据集是一致的。您的代码块似乎需要下划线。关于下划线
\uuu
是否是变量名的一部分以及它们出现的位置,您的问题中存在一些不一致之处。我在编辑时假设真实数据集是一致的。您的代码块似乎需要下划线。