长格式纵向数据按分组计算各访视减V1/V0值且缺失visit0返回NA方案
实现代码与说明
原方案依赖访视按0、1顺序排列且无缺失,通过行位置取对应值,当某ID缺失visit=0/1时取到的数值会错位,无法满足需求。
核心思路
- 不按行位置取值,直接匹配visit的实际值提取对应ID的基线value,无匹配时自动返回NA
- 无需补全缺失的visit行,也不强制要求数据集的行顺序
基础实现代码
library(dplyr) # 构造含缺失的测试数据集,验证缺失场景 set.seed(123) df <- data.frame( value = rnorm(28), visit = c(0:9, 1:9, 0,2:9), # ID B缺失visit=0,ID C缺失visit=1 id = c(rep("A", 10), rep("B",9), rep("C",9)) ) # 核心实现逻辑 df_res <- df %>% group_by(id) %>% mutate( value_chg_v1 = value - value[visit == 1], value_chg_v0 = value - value[visit == 0] ) %>% ungroup()
代码说明
分组后每组内执行value[visit == x]时:
- 若该ID存在visit=x的行,返回对应行的value值
- 若该ID不存在visit=x的行,返回NA,整组的对应差值变量自动填充为NA
完全匹配无需补全缺失行、缺失时返回NA的需求。
优化版本(兼容重复visit场景)
如果数据集可能存在同一个ID有重复的visit=0/1记录,可加first()取第一个匹配值,避免长度不匹配报错:
df_res <- df %>% group_by(id) %>% mutate( value_chg_v1 = value - first(value[visit == 1]), value_chg_v0 = value - first(value[visit == 0]) ) %>% ungroup()
内容的提问来源于stack exchange,提问作者gecko
相关产品推荐
相关产品推荐

