Я думаю, что код ниже делает то, что вы хотите.Он использует циклы *apply
, а не for
, чтобы сделать код более читабельным (я думаю).
Сначала я воссоздаю данные и проверяю, все ли столбцы a
положительны.
set.seed(20)
data <- data.frame(month = rep(month.name, 25),
a = rnorm(300, 0, 1), b = runif(300, 0, 7.2))
data$a <- abs(data$a)
Теперь, вместо циклического просмотра уникальных значений month
, я разделяю данные.кадр этой переменной.Таким образом, каждый из df в результирующем списке sp
уже является df всех строк каждого месяца.
sp <- split(data, data$month)
sp <- sp[order(order(month.name))]
Именно здесь данные log
преобразуются при необходимости.
sp <- lapply(sp, function(DF){
if(shapiro.test(DF[["a"]])$p.value < 0.05) DF[["a"]] <- log(DF[["a"]])
if(shapiro.test(DF[["b"]])$p.value < 0.05) DF[["b"]] <- log(DF[["b"]])
DF
})
И lapply
тест, который вы хотите, var.test
, для всех этих фреймов данных.
vartest_list <- lapply(sp, function(DF){
var.t <- var.test(DF[["a"]], DF[["b"]])
list(f = var.t[[1]],
p.value = var.t$p.value,
month = as.character(DF[["month"]][1]))
})
Наконец, это простой вопрос применения функции извлечения [[
к результатам испытаний.Это работает, потому что функции проверки гипотез в R возвращают объекты класса "htest"
, которые являются ничем иным, как списками.Последний цикл извлечения закомментирован.
ftest <- sapply(vartest_list, '[[', 'f')
pval <- sapply(vartest_list, '[[', 'p.value')
#month <- sapply(vartest_list, '[[', 'month')