长格式数据中提取记录子集最大值对应字符串取值的Stata操作方法
Stata长格式数据提取最大值对应字符串字段的方案
针对需要提取受试者试验第3年最高LDL值对应的采血师字符串、汇总到每个受试者第一条记录的需求,不需要硬删除记录或固定定位_n编号,用分组匹配逻辑即可实现,具体方案如下:
核心实现代码
假设采血师姓名字符串变量名为phlebotomist,可替换为实际的变量名:
* 清除冲突的旧变量 cap drop ldl3tmp cap drop ldl3max cap drop ldl3 cap drop phlebotomist_ldl3 cap drop is_ldl3_max * 原有逻辑:计算每个受试者第3年的最高LDL值 bysort id (visitdate): gen ldl3tmp = ldl if trialyear == 3 bysort id (visitdate): egen ldl3max = max(ldl3tmp) * 新增逻辑:提取最高LDL对应的采血师信息 * 1. 先给每个受试者第3年LDL为最大值的行打标记 bysort id (visitdate): gen is_ldl3_max = (ldl3tmp == ldl3max) & !missing(ldl3tmp) * 2. 将标记行的采血师值同步到该受试者所有行,仅保留第一条记录的有效值 bysort id (visitdate): gen phlebotomist_ldl3 = phlebotomist if is_ldl3_max == 1 bysort id (visitdate): replace phlebotomist_ldl3 = phlebotomist_ldl3[_n+1] if missing(phlebotomist_ldl3) bysort id (visitdate): replace phlebotomist_ldl3 = "" if _n != 1 * 原有逻辑:保留第一条记录的最高LDL值 bysort id (visitdate): gen ldl3 = ldl3max if _n == 1
补充说明
- 如果同一个受试者第3年有多条记录LDL同为最高值,上述代码会默认取
visitdate排序靠前的记录对应的采血师,若需要取排序靠后的,把排序规则里的visitdate改成-visitdate即可 - 你提到的定位最大值对应
_n编号的需求,直接用上述生成的is_ldl3_max标记变量即可定位,is_ldl3_max == 1的行就是最大值所在行,不需要写死_n == 6这类固定值,避免不同受试者最大值所在行不一致导致的错误 - 你猜测的删除非最大值记录的方法也可实现,但会丢失原始的访视数据,仅建议在已经备份原始长表的情况下使用
内容的提问来源于stack exchange,提问作者user15535192
相关产品推荐
相关产品推荐

