После выбора интересующих столбцов используйте pmap
, чтобы применить t.test
к каждой строке, выбрав первые 3 и следующие 3 наблюдения в качестве входных данных для t.test
и bind
извлеченного значения p в качестве другого столбец в исходных данных
library(tidyverse)
df %>%
select(AC.1:AM.3) %>%
pmap_dbl(~ c(...) %>%
{t.test(.[1:3], .[4:6])$p.value}) %>%
bind_cols(df, pval_AC_AM = .)
Или после выбора столбцов выполните gather
для преобразования в «длинный» формат, spread
, примените t.test
в summarise
и объедините с исходными данными
df %>%
select(compound, AC.1:AM.3) %>%
gather(key, val, -compound) %>%
separate(key, into = c('key1', 'key2')) %>%
spread(key1, val) %>%
group_by(compound) %>%
summarise(pval_AC_AM = t.test(AC, AM)$p.value) %>%
right_join(df)
Обновление
Если есть случаи, когда есть только уникальное значение, то t.test
показывает ошибку. Один из вариантов - запустить t.test
и получить NA для этих случаев. Это можно сделать с помощью possibly
posttest <- possibly(function(x, y) t.test(x, y)$p.value, otherwise = NA)
df %>%
select(AC.1:AM.3) %>%
pmap_dbl(~ c(...) %>%
{posttest(.[1:3], .[4:6])}) %>%
bind_cols(df, pval_AC_AM = .)
posttest(rep(3,5), rep(1, 5))
#[1] NA