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

求可复现REDCap「Stats and Charts」报告的R代码

复现REDCap「Stats and Charts」报告的R实现方案

目前没有开箱即用的通用代码能直接复现任意REDCap项目的「Stats and Charts」报告,但基于REDCapR、tidyverse和ggplot2工具链,可以快速构建适配所有项目的通用脚本——核心思路是利用REDCap的元数据自动识别变量类型,批量生成统计结果和可视化图表。

核心实现步骤

  • 数据与元数据获取:通过REDCap API拉取项目原始数据和元数据(包含问题类型、选项、标签等关键信息)
  • 变量分类处理:依据元数据中的field_type字段,区分连续型(number、integer、text_slider)和分类型(radio、dropdown、checkbox)变量
  • 统计计算:
    • 分类型变量:计算各选项的绝对计数、占比,同时统计缺失值数量及占比
    • 连续型变量:计算均值、中位数、标准差、极值,同步统计缺失值情况
  • 可视化生成:
    • 分类型变量用柱状图展示选项分布
    • 连续型变量用直方图/箱线图展示数值分布
  • 报告整合:通过RMarkdown将每个变量的问题描述、统计结果、图表按统一格式拼接成完整报告

示例代码片段

library(REDCapR)
library(tidyverse)
library(rmarkdown)

# 配置REDCap连接信息
redcap_url <- "你的REDCap项目URL"
token <- "你的项目API令牌"

# 获取数据和元数据
data_result <- redcap_read(redcap_uri = redcap_url, token = token)
raw_data <- data_result$data
metadata <- data_result$metadata

# 定义单变量统计与可视化函数
generate_var_report <- function(var_name, meta, data) {
  var_meta <- meta %>% filter(field_name == var_name)
  var_label <- var_meta$field_label
  var_type <- var_meta$field_type
  total_rows <- nrow(data)
  
  # 缺失值基础统计
  missing_count <- sum(is.na(data[[var_name]]))
  missing_pct <- round(missing_count / total_rows * 100, 2)
  
  if (var_type %in% c("radio", "dropdown")) {
    # 处理单选分类型变量
    # 解析选项键值对
    choices <- str_split(var_meta$select_choices_or_calculations, "\\|")[[1]] %>%
      str_trim() %>%
      map_dfr(~{
        parts <- str_split(.x, ", ")[[1]]
        tibble(code = parts[1], label = parts[2])
      })
    
    # 计算选项统计
    var_stats <- data[[var_name]] %>%
      table(useNA = "ifany") %>%
      as_tibble() %>%
      rename(count = n) %>%
      mutate(pct = round(count / total_rows * 100, 2)) %>%
      left_join(choices, by = c(".data" = "code")) %>%
      mutate(label = ifelse(is.na(label), .data, label))
    
    # 生成柱状图
    var_plot <- ggplot(var_stats, aes(x = label, y = count)) +
      geom_bar(stat = "identity", fill = "#3498db") +
      labs(title = var_label, x = "选项", y = "计数") +
      theme_minimal() +
      theme(axis.text.x = element_text(angle = 45, hjust = 1))
  } else if (var_type == "checkbox") {
    # 处理多选分类型变量(需拆分多选项)
    var_stats <- data[[var_name]] %>%
      str_split("\\|") %>%
      unlist() %>%
      table(useNA = "ifany") %>%
      as_tibble() %>%
      rename(count = n) %>%
      mutate(pct = round(count / total_rows * 100, 2))
    
    var_plot <- ggplot(var_stats, aes(x = .data, y = count)) +
      geom_bar(stat = "identity", fill = "#e74c3c") +
      labs(title = var_label, x = "选项", y = "计数") +
      theme_minimal()
  } else if (var_type %in% c("number", "integer", "text_slider")) {
    # 处理连续型变量
    var_stats <- data[[var_name]] %>%
      summarise(
        样本量 = total_rows,
        缺失值数量 = missing_count,
        缺失值占比 = paste0(missing_pct, "%"),
        均值 = round(mean(., na.rm = TRUE), 2),
        中位数 = round(median(., na.rm = TRUE), 2),
        标准差 = round(sd(., na.rm = TRUE), 2),
        最小值 = round(min(., na.rm = TRUE), 2),
        最大值 = round(max(., na.rm = TRUE), 2)
      )
    
    # 生成直方图
    var_plot <- ggplot(data, aes(x = .data[[var_name]])) +
      geom_histogram(bins = 12, fill = "#2ecc71", alpha = 0.7) +
      labs(title = var_label, x = "数值", y = "频数") +
      theme_minimal()
  } else {
    # 处理文本等其他类型变量(仅统计缺失值)
    var_stats <- tibble(
      变量标签 = var_label,
      缺失值数量 = missing_count,
      缺失值占比 = paste0(missing_pct, "%")
    )
    var_plot <- NULL
  }
  
  return(list(label = var_label, stats = var_stats, plot = var_plot))
}

# 遍历所有变量生成报告内容
all_var_reports <- map(metadata$field_name, ~generate_var_report(.x, metadata, raw_data))

# 后续可通过RMarkdown模板循环渲染所有内容生成最终报告

扩展说明

  • 上述代码可直接适配任意REDCap项目,仅需替换redcap_url和token
  • 针对checkbox类型的多选变量,可进一步优化拆分逻辑,实现单个选项的独立统计
  • 可通过调整ggplot2参数自定义图表样式,匹配REDCap原生报告风格
  • 最终报告可通过RMarkdown导出为HTML、PDF或Word格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:54:57