You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:07:15