使用purrr的map函数对多时间点变量迭代执行统计分析问题
R纵向重复测量数据集批量操作方案
1. 批量数值变量正态性检验输出结果数据框
shapiro.test返回的是htest类列表,无法直接用map_dfr绑定,需要先通过broom包的tidy函数转换为单行结构化结果,再进行合并:
library(tidyverse) library(broom) # 替换your_data为你的数据集名 shapiro_result <- your_data %>% select(where(is.numeric)) %>% # 自动筛选所有数值型变量 map_dfr(~ shapiro.test(.x) %>% tidy(), .id = "variable_name")
输出结果直接包含变量名、统计量、p值、置信区间等标准化字段,可直接导出为csv使用。
2. 同变量多时间点批量配对t检验
首先提取所有重复测量变量的公共前缀(去掉_vxx时间后缀),再按前缀匹配对应时间点的列执行检验:
# 提取所有变量的公共前缀 var_prefixes <- str_remove(names(your_data), "_v[0-9]+$") %>% unique() # 可手动过滤非重复测量的变量前缀,比如ID、性别这类单时间点变量 # 以6个月(v66)和基线(v00)的配对t检验为例 t_test_result <- var_prefixes %>% set_names() %>% map_dfr(function(prefix) { baseline <- your_data[[paste0(prefix, "_v00")]] time_col <- your_data[[paste0(prefix, "_v66")]] t.test(baseline, time_col, paired = TRUE) %>% tidy() }, .id = "variable_prefix") # 导出结果 write_csv(t_test_result, "配对t检验结果.csv")
如果需要做12个月(v01)和基线的检验,只需把代码中的_v66替换为_v01即可。
3. 批量生成基线差值列
使用dplyr的across功能配合动态命名规则,可一次性生成所有时间点的差值列,无需重复写mutate语句:
your_data <- your_data %>% mutate( # 生成6个月与基线的差值列 across(ends_with("_v66"), ~.x - get(str_replace(cur_column(), "_v66$", "_v00")), .names = "d_{str_remove(.col, '_v66$')}_v66"), # 生成12个月与基线的差值列 across(ends_with("_v01"), ~.x - get(str_replace(cur_column(), "_v01$", "_v00")), .names = "d_{str_remove(.col, '_v01$')}_v01") )
生成的新列完全符合d_变量名_时间点的命名规则,可直接用于后续分析。
内容的提问来源于stack exchange,提问作者Javier Hernando
相关产品推荐
相关产品推荐

