Stata:如果数据丢失,则根据另一行替换一行的值

Stata: Replace values of one row based on another if data are missing

在 Stata 中,我试图仅在缺少值的情况下基于其正上方或正下方的值更改一行的值(字符串和数字)。以下是一些示例数据:

input 
str40 id var1 var2 var3 var4 str40 var5_string str40 var6_string
"correctly-spelled" 10 20 . . "random text 1" ""
"misspelled" . . 30 40 "" "random text 2" 
end

基本上,我希望我的最终数据集如下所示:

input
id var1 var2 var3 var4 var5_string var6_string
"correctly-spelled" 10 20 30 40 "random text 1" "random text 2"
end

我需要一个特定于行的解决方案(即避免 collapse),因为我的(宽)数据集有数千个标记变量,我不想因为 [=12= 而丢失标签].另外,并不是所有的变量都是数字的,变量的命名约定也不一致。因此,用简单的 replace 修复 id 的拼写、执行 collapse (firstnm) id var5_string var6_string (mean) var1 var2 var3 var4, by(id) 或对任何事情使用 var* 都无济于事。基本上,发生的事情是一个人使用“正确拼写”id 合并,另一个人使用“拼写错误”id 合并,而我没有任何源文件。谢谢!

如果您可以假设拼写错误的 ID 紧跟在正确拼写之后(或之前),您可以使用 _n±1 来获取前一个或后一个值。有关 系统变量 的更多信息,请参阅 help _variables

  • 如果您假设正确的总是第一个,那么第二个 replace 就足够了。
  • mi() 是缩写的 missing() 函数。
  • 第二个条件 & !mi(var'[_n±1])`,只是为了确保非缺失值不会被缺失值替换,如果有两个有效(但不同)的 ID依次向上。根据您的数据,可能不需要此进一步条件。
local list_of_vars var1 var2 var3 var4 var5_string var6_string
foreach var of local list_of_vars {
    replace `var' = `var'[_n-1] if mi(`var') & !mi(`var'[_n-1])
    replace `var' = `var'[_n+1] if mi(`var') & !mi(`var'[_n+1])
}
. list

     +-------------------------------------------------------------------------------+
     |                id   var1   var2   var3   var4     var5_string     var6_string |
     |-------------------------------------------------------------------------------|
  1. | correctly-spelled     10     20     30     40   random text 1   random text 2 |
  2. |        misspelled     10     20     30     40   random text 1   random text 2 |
     +-------------------------------------------------------------------------------+

然后只保留正确的。希望你能以某种方式识别它们。

// the following is just to be able to identify the correct id's, of course you will have to adapt it so that it matches only the correctly-spelled IDs or you have other way of identifying them :)
gen _ck_corect_id = (id=="correctly-spelled")

keep if _ck_corect_id==1