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

R语言:按ID提取变量最后一个非NA值并生成新变量

嗨,我来帮你搞定这个需求!首先得提个小细节:你原代码里的datvisit会被R当成数值计算(比如25/06/2014会变成一个小数),所以我先把它修正成日期类型,这样数据才符合实际意义。

第一步:修正数据框的日期格式

data0 <- data.frame(
  id = c("AH001","AH001","AH002","AH002","AH002","AH002","AH003","AH003","AH003","AH003"),
  numvisit = c(2,3,2,3,4,5,2,3,4,5),
  datvisit = as.Date(c("25/06/2014","24/07/2014","25/06/2014","24/07/2014","25/08/2014","26/09/2014","25/06/2014","24/07/2014","25/08/2014","26/09/2014"), format = "%d/%m/%Y"),
  weight = c(51.3,51.4,59.8,59.6,NA,NA,52.2,52.5,NA,NA),
  center = c(1,1,1,1,1,1,1,1,1,1)
)

方法一:用dplyr(tidyverse风格)实现

这是现在最常用的分组处理方式,代码清晰易懂:

library(dplyr)

data0 <- data0 %>%
  group_by(id) %>%
  # 提取每个id下非NA的weight,取最后一个值;如果全是NA则返回NA
  mutate(poidslast = last(weight[!is.na(weight)])) %>%
  ungroup()

方法二:用base R实现(无需额外包)

如果你不想加载tidyverse包,用base R的ave函数也能轻松搞定:

data0$poidslast <- ave(data0$weight, data0$id, 
                       FUN = function(x) tail(x[!is.na(x)], 1))

最终效果

运行完上面任意一种方法后,data0就会新增poidslast列:

  • 所有id=AH001的行,poidslast都是51.4(该id最后一个非NA的weight)
  • 所有id=AH002的行,poidslast都是59.6
  • 所有id=AH003的行,poidslast都是52.5

内容的提问来源于stack exchange,提问作者Djamiou Dossa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:56:41