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

如何基于随访数据范围在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 13:22:13