如何基于随访数据范围在R中创建月度标记变量
R语言:根据随访数值生成月度区间指示变量
解决方案1:使用tidyverse(推荐,代码更直观)
先安装并加载tidyverse包,再按以下步骤处理:
# 安装并加载tidyverse(首次使用需安装) install.packages("tidyverse") library(tidyverse) # 你的样本数据 sampledata <- data.frame( Pat_ID = c(1123, 1134, 1138, 1139), baseline = c("0", "0", "0", "0"), followup_1 = c(97, 89, NA, 95), followup_2 = c(NA, 168, NA, 245), followup_3 = c(NA, NA, NA, NA), followup_4 = c(NA, NA, NA, NA), followup_5 = c(NA, NA, NA, NA), followup_6 = c(NA, NA, NA, NA), ) # 定义月度区间断点和对应标签 breaks <- c(0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330, 365) labels <- paste0(1:12, "_month") # 数据处理流程 result <- sampledata %>% # 将宽格式随访列转为长格式,剔除NA值 pivot_longer(cols = starts_with("followup"), names_to = "followup_col", values_to = "days", values_drop_na = TRUE) %>% # 匹配每个随访值对应的月度区间 mutate(month_group = cut(days, breaks = breaks, labels = labels, include.lowest = TRUE)) %>% # 标记每个患者的有效区间 group_by(Pat_ID, month_group) %>% summarise(flag = 1, .groups = "drop") %>% # 转回宽格式,缺失区间填充0 pivot_wider(names_from = month_group, values_from = flag, values_fill = 0) %>% # 确保所有原始患者都被保留 right_join(sampledata %>% select(Pat_ID), by = "Pat_ID") %>% # 填充所有缺失的月度区间为0,并按顺序排列列 mutate(across(all_of(labels), ~replace_na(.x, 0))) %>% select(Pat_ID, all_of(labels)) # 查看结果 print(result)
解决方案2:基础R方法(无需额外包)
如果不想使用tidyverse,可以用基础R循环实现:
# 你的样本数据 sampledata <- data.frame( Pat_ID = c(1123, 1134, 1138, 1139), baseline = c("0", "0", "0", "0"), followup_1 = c(97, 89, NA, 95), followup_2 = c(NA, 168, NA, 245), followup_3 = c(NA, NA, NA, NA), followup_4 = c(NA, NA, NA, NA), followup_5 = c(NA, NA, NA, NA), followup_6 = c(NA, NA, NA, NA), ) # 提取所有随访列 followup_cols <- grep("followup", names(sampledata), value = TRUE) # 定义区间断点和标签 breaks <- c(0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330, 365) labels <- paste0(1:12, "_month") # 初始化结果数据框,所有月度变量默认设为0 result_base <- data.frame(Pat_ID = sampledata$Pat_ID) result_base[labels] <- 0 # 遍历每个患者处理 for (i in 1:nrow(sampledata)) { # 获取当前患者的非NA随访值 patient_vals <- na.omit(unlist(sampledata[i, followup_cols])) if (length(patient_vals) > 0) { # 匹配对应的月度区间 matched_groups <- cut(patient_vals, breaks = breaks, labels = labels, include.lowest = TRUE) # 将对应区间的变量设为1 result_base[i, as.character(matched_groups)] <- 1 } } # 查看结果 print(result_base)
关键说明
cut函数是核心:它能自动根据定义的区间,把数值映射到对应的月度标签,include.lowest = TRUE确保≤30的数值被分到1_month- 两种方法都处理了多个随访值落在不同区间的情况(比如患者1134的89落在3_month,168落在6_month,两个变量都会被设为1)
- 自动处理无有效随访值的患者(比如1138),所有月度变量保持0
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

