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

R语言提取各id下字段最后非NA值并匹配对应年份生成表格

解决方案

tidyverse 实现

核心思路是先将宽表转为长表,按id和字段分组取最后非NA值,再转回宽表即可保留年份对应关系:

library(tidyverse)

result <- dat %>%
  # 转为长表,自动过滤NA值
  pivot_longer(cols = c(x, y, z), names_to = "var", values_drop_na = TRUE) %>%
  # 按id、字段分组,取年份最大的最后一条记录
  group_by(id, var) %>%
  arrange(year) %>%
  slice_tail(n = 1) %>%
  ungroup() %>%
  # 转回宽表,补前缀,缺失值统一填NA
  pivot_wider(names_from = var, values_from = value, names_prefix = "last_", values_fill = NA) %>%
  # 调整列顺序和目标格式一致
  select(id, year, last_x, last_y, last_z) %>%
  arrange(id, year)

运行后和你给出的target_result完全一致,且自动过滤了全字段都是NA的id c。


data.table 实现

如果你习惯用data.table,也可以用melt+dcast的逻辑实现:

library(data.table)
setDT(dat)

result_dt <- dcast(
  # 转长表去NA、按分组取最后一条有效记录
  melt(dat, id.vars = c("id", "year"), na.rm = TRUE)[
    order(year), .SD[.N], by = .(id, variable)
  ],
  # 转回宽表,缺失值填NA
  id + year ~ variable, value.var = "value", fill = NA
)
# 修改列名、调整顺序匹配目标格式
setnames(result_dt, c("x", "y", "z"), c("last_x", "last_y", "last_z"))
setcolorder(result_dt, c("id", "year", "last_x", "last_y", "last_z"))
setorder(result_dt, id, year)

两种方法都不会破坏值和对应年份的绑定关系,因为是单独对每个字段的非NA记录匹配对应年份后,再做的宽表转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:24:04