Отвечать легче, когда вы предоставляете воспроизводимые данные. Нетрудно придумать:
set.seed(42)
EyeColour <- sample(c("Blue", "Brown", "Green"), 500, replace=TRUE)
HairColour <- sample(c("Black", "Blond", "Red"), 500, replace=TRUE)
Weight <- rnorm(500, 1.5, .15)
Height <- rnorm(500, .3, .05)
Gender <- sample(c("F", "M"), 500, replace=TRUE)
dfm <- data.frame(EyeColour, HairColour, Weight, Height, Gender)
Теперь мы просто используем split
и lapply
:
dfm.split <-split(dfm, dfm[, c("EyeColour", "HairColour", "Gender")])
library(nortest)
wgt.norm <- lapply(dfm.split, function(x) lillie.test(x$Weight))
hgt.norm <- lapply(dfm.split, function(x) lillie.test(x$Height))
Результаты возвращаются в виде списков для всех комбинаций. , Все будет немного сложнее, если в некоторых группах будет менее 5 наблюдений (минимум, необходимый для теста):
wgt.norm[1]
# $Blue.Black.F
#
# Lilliefors (Kolmogorov-Smirnov) normality test
#
# data: x$Weight
# D = 0.11064, p-value = 0.4328
hgt.norm[1]
# $Blue.Black.F
#
# Lilliefors (Kolmogorov-Smirnov) normality test
#
# data: x$Height
# D = 0.11593, p-value = 0.3586
Вам нужно будет прочитать о split
, lapply
и как работать с lists
, но они предназначены для решения проблемы, над которой вы работаете.