R语言中提取指定列数值并跳过NA值的实现(癌症登记数据场景)
R实现癌症登记数据特征提取方案
以下代码基于tidyverse套件实现,适配2005-2020年的全量数据,无需手动指定年份列:
library(tidyverse) # 宽表转长表后分组计算所有目标变量 result <- ex_data %>% # 自动拆分x/y前缀与年份后缀,转为id-年份为单位的长表结构 pivot_longer( cols = -c(id, diagnosis_yr), names_to = c(".value", "year"), names_sep = "_", names_transform = list(year = as.integer) ) %>% group_by(id, diagnosis_yr) %>% summarize( # 提取最早年份的非空x值 x_earliest = x[!is.na(x)][which.min(year[!is.na(x)])], # 提取最晚年份的非空y值 y_latest = y[!is.na(y)][which.max(year[!is.na(y)])], # 追溯确诊及之前年份的可用x值 x_at_diagnosis = { valid_idx <- year <= diagnosis_yr & !is.na(x) if (any(valid_idx)) x[valid_idx][which.max(year[valid_idx])] else NA_real_ }, # 追溯确诊及之前年份的可用y值 y_at_diagnosis = { valid_idx <- year <= diagnosis_yr & !is.na(y) if (any(valid_idx)) y[valid_idx][which.max(year[valid_idx])] else NA_character_ }, .groups = "drop" )
运行后得到的result与你给出的wanted表完全一致。代码逻辑完全兼容2005-2020年的全量数据,只要保留x_年份、y_年份的列名规则即可直接使用,无需调整参数。
内容的提问来源于stack exchange,提问作者moonlu
相关产品推荐
相关产品推荐

