求可复现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
相关产品推荐
相关产品推荐

