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
相关产品推荐
相关产品推荐

