如何在R中迭代计算列表内数据框中编码者与锚定编码者的相关性?
批量计算编码者与锚定编码者的相关性
示例数据
你手头的数据集结构如下,my_list包含多个记录编码者时长数据的dataframe:
file1 <- data.frame(coder=c("coder1", "coder1", "coder1", "coder1", "coder2","coder2", "coder2", "coder2", "anchor", "anchor", "anchor", "anchor"), dur=c(120, 80, 60, 30, 257, 80, 55, 21, 130, 95, 60, 32)) file2 <- data.frame(coder=c("coder1", "coder1", "coder1", "coder1", "coder2","coder2", "coder2", "coder2", "anchor", "anchor", "anchor", "anchor"), dur=c(130, 95, 60, 32, 123, 80, 62, 14, 257, 80, 55, 21)) file3 <- data.frame(coder=c("coder1", "coder1", "coder1", "coder1", "coder2","coder2", "coder2", "coder2", "anchor", "anchor", "anchor", "anchor"), dur=c(32, 123, 80, 62, 130, 95, 60, 32, 123, 80, 62, 14)) my_list <- list(file1, file2, file3)
需求
对my_list中的每个dataframe,分别计算coder1、coder2的dur值与anchor的dur值的Spearman相关系数,最终生成包含以下列的结果表:
comparison:对应每个文件的标识(如cor_test_F1)coder:编码者名称r:计算得到的相关系数
解决方案
方法1:使用tidyverse工具链
借助dplyr和purrr实现批量处理,代码简洁且可读性强:
library(tidyverse) # 定义单个dataframe的处理逻辑 calculate_cor <- function(df, file_num) { # 提取锚定编码者的时长数据 anchor_dur <- df %>% filter(coder == "anchor") %>% pull(dur) df %>% # 筛选目标编码者 filter(coder %in% c("coder1", "coder2")) %>% group_by(coder) %>% # 计算Spearman相关系数 summarise( r = cor.test(dur, anchor_dur, method = "spearman")$estimate, .groups = "drop" ) %>% # 添加文件标识列 mutate(comparison = str_glue("cor_test_F{file_num}")) %>% # 调整列顺序 select(comparison, coder, r) } # 遍历列表并合并所有结果 output <- imap_dfr(my_list, calculate_cor) # 查看最终结果 output
方法2:使用基础R语法
无需加载额外包,通过lapply实现批量处理:
# 定义处理单个dataframe的函数 calculate_cor_base <- function(df, file_name) { # 提取锚定编码者的时长数据 anchor_dur <- df$dur[df$coder == "anchor"] # 分别计算两个编码者与anchor的相关系数 cor_coder1 <- cor.test(df$dur[df$coder == "coder1"], anchor_dur, method = "spearman")$estimate cor_coder2 <- cor.test(df$dur[df$coder == "coder2"], anchor_dur, method = "spearman")$estimate # 生成结果行 data.frame( comparison = file_name, coder = c("coder1", "coder2"), r = c(cor_coder1, cor_coder2) ) } # 生成每个文件的标识名称 file_labels <- paste0("cor_test_F", seq_along(my_list)) # 遍历列表并合并结果 output_base <- do.call(rbind, lapply(seq_along(my_list), function(i) { calculate_cor_base(my_list[[i]], file_labels[i]) })) # 查看最终结果 output_base
两种方法都能生成符合预期格式的结果表,可根据个人编程习惯选择使用。
内容的提问来源于stack exchange,提问作者Catherine Laing
相关产品推荐
相关产品推荐

