在R中按ID对多列变量执行末次观测结转(LOCF)方法
对多列变量执行末次观测结转(LOCF)的方法
针对你的纵向数据,要按id分组对var1和var2执行LOCF,这里提供几种实用的方法:
方法1:基于你现有代码扩展(zoo + gsubfn)
直接在transform里同时处理多列变量,写法和单变量一致,多添加几行即可:
library(zoo) library(gsubfn) # 对var1和var2同时执行LOCF dt_locf <- transform(dt, var1 = fn$ave(var1, id, FUN = ~ na.locf(x, na.rm = FALSE)), var2 = fn$ave(var2, id, FUN = ~ na.locf(x, na.rm = FALSE)) )
如果后续有更多需要处理的变量,继续在transform中添加对应行即可。
方法2:批量处理多列(dplyr + zoo,更高效)
当需要处理的变量较多时,用dplyr的across函数可以批量操作,不用逐个列名编写:
library(dplyr) library(zoo) # 方式A:指定具体要处理的列 dt_locf <- dt %>% group_by(id) %>% mutate(across(c(var1, var2), ~ na.locf(., na.rm = FALSE))) %>% ungroup() # 方式B:处理除id、visit外的所有列(适合变量较多的场景) dt_locf <- dt %>% group_by(id) %>% mutate(across(-c(id, visit), ~ na.locf(., na.rm = FALSE))) %>% ungroup()
补充说明
na.locf(x, na.rm = FALSE)会保留开头的NA(比如患者第一次观测就是缺失值时,不会被替换),这符合LOCF的常规逻辑;如果需要用后续的非NA值填充开头的缺失,可以添加fromLast = TRUE参数,但这属于向前结转(NOCB),不是标准的LOCF。- 执行完后可以查看
dt_locf,验证每个患者的缺失值是否被最近的前一次非缺失值填充。
内容的提问来源于stack exchange,提问作者YYM17
相关产品推荐
相关产品推荐

