首页 > 解决方案 > 循环配对 data.frame 列以在 R 中进行 t.test

问题描述

在我的 data.frame 中D(见打击)有8成对的列。例如Q1_aQ1_b,Q2_aQ2_b...Q8_aQ8_b.

t.test我想知道如何使用每对作为 BASE R 中的输入来执行 a ?

例如,第一个t.testt.test(Q1_a, Q1_b),第二个是t.test(Q2_a, Q2_b)... t.test(Q8_a, Q8_b)

D <- read.csv("https://raw.githubusercontent.com/izeh/m/master/s.csv")

标签: rlistloopsdataframelapply

解决方案


我们可以split进入listwithsplit.default然后循环listwith lapply,使用匿名函数调用提取列并执行t.test

out <- lapply(split.default(D, sub("_.*", "", names(D))),
         function(x) t.test(x[[1]], x[[2]]))

sub匹配 'D' 的列名中_后跟字符 ( .*) 的模式并替换为空白 ( "") 以便在 中list,我们得到每个成对列 ('Q1_a', 'Q1_b', ..., 'Q8_a ', 'Q8_b')


如果我们使用tidyverse,一个选项是转为“长”格式,然后应用summarise_at

library(dplyr)
library(tidyr)
D %>%
    pivot_longer(everything(), names_to = c(".value", "grp"), 
     names_sep = "_") %>% 
    summarise_at(vars(-grp), ~ list(t.test(.[grp == 'a'], .[grp == 'b']))) 

推荐阅读