如何解决逐行捕获非缺失值并将其存储在新变量中
我的数据集包含多个变量,称为 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
仅包含缺失值且未生成以下变量。但是,我 set 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 |
+--------------------+
优点:
您的数据布局需要由 rename
尤其是 reshape long
给出的某种结构。我不会在此处提供 reshape wide
的代码,因为对于绝大多数 Stata 用途,您最好使用这种布局。
缺点:
!mi(var`x')
返回变量的第一个值是否不丢失。如果 foo
是数据集中的变量,则 !mi(foo)
被评估为 !mi(foo[1])
。这不是你想要的。有关完整故事,请参阅 https://www.stata.com/support/faqs/programming/if-command-versus-if-qualifier/。
我建议使用更具吸引力的变量名称。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。