【问题标题】:looping over paired data.frame columns to do t.test in R循环配对 data.frame 列以在 R 中进行 t.test
【发布时间】:2020-05-27 07:52:35
【问题描述】:

在我的data.frame D(见吹)中有8 对列。例如,Q1_aQ1_bQ2_aQ2_b ...Q8_aQ8_b

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

例如,第一个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")

【问题讨论】:

    标签: r list loops dataframe lapply


    【解决方案1】:

    我们可以将splitsplit.default 转换成list,然后用lapply 循环遍历list,用匿名函数调用提取列并执行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']))) 
    

    【讨论】:

    • @Reza 是的,它的拆分顺序与数据集中的顺序相同
    • @Reza 如果你想更扎实,那么使用x[[grep("a$", names(x))]]x[[grep("b$", names(x))]]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 2016-05-10
    • 2018-08-01
    相关资源
    最近更新 更多