Предполагая, что ваши данные находятся в файле data.frame, называемом df, со столбцами NO, SPECIES, SEX, BW:
set.seed(100)
df = data.frame(NO=1:100,
SPECIES=sample(LETTERS[1:4],100,replace=TRUE),
SEX=sample(c("M","F"),100,replace=TRUE),
BW = rnorm(100,80,2)
)
И мы производим вид D, чтобы иметь эффект:
df$BW[df$SPECIES=="D" & df$SEX=="M"] = df$BW[df$SPECIES=="D" & df$SEX=="M"] + 5
Если мы хотим сделать это для одного фрейма данных, скажем, для вида А, мы делаем
dat = subset(df,SPECIES=="A")
t.test(BW ~ SEX,data=dat)
И вы получите соответствующую статистику и так далее. Чтобы сделать это систематически для всех ВИДОВ, мы можем использовать broom, dplyr:
library(dplyr)
library(broom)
df %>% group_by(SPECIES) %>% do(tidy(t.test(BW ~ SEX,data=.)))
# A tibble: 4 x 11
# Groups: SPECIES [4]
SPECIES estimate estimate1 estimate2 statistic p.value parameter conf.low
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 A 0.883 80.4 79.6 0.936 3.65e-1 14.2 -1.14
2 B 0.259 80.2 79.9 0.377 7.12e-1 14.1 -1.21
3 C 0.170 80.1 79.9 0.359 7.23e-1 25.3 -0.807
4 D -5.55 79.7 85.2 -7.71 1.29e-7 21.4 -7.05
Если вы не хотите устанавливать какие-либо пакеты, это даст вам все результаты теста:
by(df, df$SPECIES, function(x)t.test(BW ~ SEX,data=x))
И объединяя их в один data.frame:
func = function(x){
Nu=t.test(BW ~ SEX,data=x);
data.frame(estimate_1=Nu$estimate[1],estimate_2=Nu$estimate[2],p=Nu$p.value)}
do.call(rbind,by(df, df$SPECIES,func))