replace - 根据唯一标识符将值从一个观察值复制到另一个观察值
问题描述
我有一个包含许多变量的数据集。对于许多观察值,我想用基于唯一标识符的另一个观察值(对于相同变量)替换它们的值(在大量变量中)。唯一标识符不等于 Stata 观察编号 (_n)。
这类似于其他几个线程,但据我所知,他们的解决方案不是完全可转移的
- 在Stata中将值从一个变量转移到另一个变量但是我没有可以使用的简单词汇关系
- https://www.stata.com/statalist/archive/2013-06/msg00056.html但我不能依赖Stata观察数字,因为数据集是动态的,观察的顺序和数量可能会改变。
这是一段基于第二个链接的解决方案的代码,但已针对我的问题进行了调整(我更改了最后一个宏中方括号的内容)。我知道这段代码不起作用,因为这里的方括号只能包含一个 Stata obs 编号 (_n)。但我认为这应该很好地说明我想要实现的目标:
在此示例中,我想将 unique_id 为 25 和 38 的观察值替换为 unique_id 为 21 的观察值。这应该对我的本地 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 中,例如,然后将其用作下标,这是一个直接的答案,但不是好的或稳健的风格。
另请参阅这篇论文,了解该领域的一些技术。
我会同情那些认为 Stata 风格在这个问题上看起来很尴尬的人。此外,这种问题似乎非常特别,但这样的问题也是真实的。
推荐阅读
- java - 如何在 ARCore 中放置 3D 盒子
- loops - 如何编码 python/pyspark if 语句(中等/硬复杂度)?
- jmeter - 用于从请求方法中的 URL 中提取值的后处理程序
- c++ - 为什么允许将 std::begin(v) 缩写为 begin(v) 作为 std::find() 的参数?
- python - Spyder 5(独立)- 不启动
- android - 验证后如何登录 Vimeo
- java - 如何使用 Spring Cloud Stream 将 RabbitMQ 中的消息直接发送到队列
- c# - 仅在函数中评估传递的对象
- python - 使用未检测到的 chromedriver + selenium,python 打开第二个窗口
- c++ - 与文件中的数据进行比较时,字符串比较失败