根据唯一标识符将值从一个观察值复制到另一个观察值

Copy values from one observation to another based on unique identifier

我有一个包含很多变量的数据集。对于许多观察结果,我想根据唯一标识符将它们的值(在大量变量中)替换为另一个观察结果(对于相同变量)的值。唯一标识符不等于 Stata 观测值 (_n)。

这与其他几个线程类似,但据我所知,它们的解决方案并不是完全可移植的

  1. transfer values from one variable to another in Stata但是我没有简单的词法关系 我可以使用
  2. https://www.stata.com/statalist/archive/2013-06/msg00056.html 但我不能依赖 Stata 观测值,因为数据集是动态的,观测值的顺序和数量可能会发生变化。

这是一段基于第二个 link 的解决方案的代码,但针对我的问题进行了调整(我更改了最后一个宏中方括号的内容)。我知道这段代码不起作用,因为这里的方括号只能包含 Stata obs 编号 (_n)。但我认为这应该很好地说明了我正在努力实现的目标:

在这个例子中,我想用 unique_id 为 21 的观察值替换 unique_id 为 25 和 38 的观察值。这应该对所有我本地 varlist 中的变量。

set obs 50

local vlist v1 v2 v3 v4 v5

foreach v of local vlist { 
    generate `v' = runiform()
}

gen unique_id=_n+20  // this is just to illustrate that the unique_id is not equal to _n


foreach var of local vlist {
replace `var' =`var'[unique_id==21] if unique_id==25 | unique_id==38
}

这是一种方法:

foreach var of local vlist {
    su `var' if unique_id == 21, meanonly 
    replace `var' = r(mean) if unique_id==25 | unique_id==38
}

还有另一种方法:

gen reference = unique_id == 21 
sort reference 

foreach var of local vlist {
    replace `var' = `var'[_N] if unique_id==25 | unique_id==38
}

当然,如果您查看数据并计算出目前标识符 21 在观察值 42 中,那么使用它作为下标是一个直接的答案,但不是好的或稳健的风格。

另请参阅 this paper 以了解该领域的一些技巧。

我对任何认为 Stata 风格在这个问题上看起来很尴尬的人表示同情。另外,这种问题看起来很临时,但这样的问题也是真实的。