我有一个包含许多变量的数据集。对于许多观察值,我想根据唯一标识符将它们的值(在大量变量中)替换为另一个观察值(对于相同变量)的值。唯一标识符不等于Stata观测数(_n)。
这与其他几个线程类似,但据我所知,他们的解决方案并不完全可迁移
这是一段基于第二个链接解决方案的代码,但根据我的问题进行了调整(我更改了最后一个宏中方括号的内容)。我知道这段代码不起作用,因为这里的方括号只能包含一个 Stata obs 编号 (_n)。但我认为这应该很好地说明了我正在努力实现的目标:
在此示例中,我想将 unique_id 为 25 和 38 的观察值替换为 unique_id 为 21 的观察值。这应该对本地变量列表中的所有变量进行。
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
}
答案 0 :(得分:1)
这是一种方法:
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 风格在这个问题上看起来很尴尬的人。此外,这种问题看起来非常临时,但这样的问题也是真实存在的。