цикл по парным столбцам data.frame для выполнения t.test в R - PullRequest
1 голос
/ 11 февраля 2020

В моем data.frame D (см. Удар) есть 8 пары столбцов. Например, Q1_a и Q1_b, Q2_a и Q2_b ... Q8_a и Q8_b.

Мне было интересно, как выполнить t.test, используя каждую пару в качестве вход в BASE R?

Например, первый t.test будет t.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")

1 Ответ

2 голосов
/ 11 февраля 2020

Мы можем split в list с split.default, а затем l oop над list с 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']))) 
...