Изменения

Перейти к: навигация, поиск
м
Применение функций к нескольким переменным
С помощью <code>apply</code>-функций можно последовательно применить функцию к вектору, списку или массиву. Прежде чем всего нам необходимо сформировать таблицу данных. С помощью функции <code>replicate()</code> сгенерируем 10 переменных, имеющих стандартное нормальное распределение, которые объединяются в класс <code>data.frame</code>.
{{r-code|code=<nowiki>
> DF <- data.frame(replicate(n = 10, rnorm(n = 100)))
</nowiki>
}}
Структура сгенерированной таблицы выглядит следующим образом:
{{r-code|code=<nowiki>
> str(DF)
'data.frame': 100 obs. of 10 variables:
$ X9 : num -0.8508 0.4481 -0.2828 -0.5464 0.0605 ...
$ X10: num 1.421 0.408 1.254 -0.956 -1.91 ...
</nowiki>
}}
Для решения поставленной задачи можно воспользоваться функцией <code>sapply()</code>. Но прежде, нам необходимо немного отформатировать формат вывода результатов нашей функции: нам нужно извлечь значения критерия и его уровень значимости, т.к. результат функции <code>shapiro.test()</code> содержит также информацию, которая не подлежит включению в таблицу.
{{r-code|code=<nowiki>
> shapiro.test(x)
data: x
W = 0.9903, p-value = 0.6882
</nowiki>
}}
Структура результата применения функции <code>shapiro.test()</code> представлена ниже:
{{r-code|code=<nowiki>
> str(shapiro.test(x))
List of 4
$ data.name: chr "x"
- attr(*, "class")= chr "htest"
</nowiki>
}}
Как видим, помимо значений критерия и уровня значимости здесь содержится информация о применяемом методе. Мы можем отфильтровать вывод следующим образом:
{{r-code|code=<nowiki>
> normTest <- function (x) {
+ res <- shapiro.test(x)
+ return(c(res$statistic, p.value = res$p.value))
+ }
</nowiki>
}}
Результат теперь будет выглядеть следующим образом:
{{r-code|code=<nowiki>
> normTest(x)
W p.value
0.9903 0.6882
</nowiki>
}}
Теперь можно использовать данную функцию при обработке столбцов нашей таблицы.
{{r-code|code=<nowiki>
> t(sapply(DF, normTest))
W p.value
X9 0.9915 0.7834
X10 0.9808 0.1531
</nowiki>
}}
Того же результата можно добиться и с помощью функции <code>lapply()</code><ref>По результатам сравнения производительности, данный вариант оказался чуть быстрее предыдущего.</ref>:
{{r-code|code=<nowiki>
> do.call(rbind, lapply(DF, normTest))
W p.value
X9 0.9915 0.7834
X10 0.9808 0.1531
</nowiki>
}}

Навигация