использовать функцию для нескольких столбцов (переменных) в r - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь запустить тесты на однородность дисперсии с помощью функции leveneTest из пакета car. Я могу запустить тест для одной переменной, например (используя набор данных iris в качестве примера)

library(car)
library(datasets)

data(iris)

leveneTest(iris$Sepal.Length, iris$Species)

Однако я хотел бы запустить тест для всех зависимых переменных в наборе данных одновременно (так что Sepal Длина, Ширина лепестка, Длина лепестка, Ширина лепестка). Я предполагаю, что это как-то связано с семейством функций apply (sapply, lapply, tapply), но я просто не могу понять, как это сделать. Ближайшее, что я пришел, выглядит примерно так:

lapply(iris, leveneTest(group = iris$Species))

Однако я получаю сообщение об ошибке

Error in leveneTest.default(group = iris$Species) : 
  argument "y" is missing, with no default

Что, как я понимаю, вероятно, связано с тем, что он не может указать переменные результата. Я уверен, что мне не хватает очевидного использования функций apply, но я просто не понимаю, что это такое. Приносим извинения за основной вопрос c, но я относительно новичок в R и часто применяю одну и ту же функцию к нескольким переменным (обычно копируя код несколько раз), поэтому было бы здорово понять, как правильно использовать эти функции: )

Ответы [ 2 ]

6 голосов
/ 27 мая 2020

Общие параметры функции необходимо передать в ... в пределах lapply. Примерно так:

lapply(subset(iris, select = -Species), leveneTest, group = iris$Species)

help("lapply") объясняет, что ... предназначен для «необязательных аргументов для FUN» (то есть необязательно для lapply, а не для FUN) и предоставляет lapply(x, quantile, probs = 1:3/4) в качестве примера.

2 голосов
/ 27 мая 2020

Накладывая ответ @ Roland, вы также можете сделать следующее в базе R:

lapply(iris[,-5], leveneTest, group = iris$Species

-5, очевидно, указывает c на набор данных iris. Вы можете заменить его переменной, например

lapply(iris[,-length(iris)]....

, и это позволит вам удалить последний элемент df, если ваша группирующая переменная является последней.

Кроме того, в качестве фанатской таблицы data.table , Я добавлю вариант, чтобы вы могли использовать и это, если вам интересно.

dt.iris[, lapply(.SD, leveneTest, group = Species), .SDcols = !'Species']

этот код позволяет вам «удалить» столбец Species из вашей функции lapply аналогично вышеупомянутые базовые примеры R, но путем явного имени через переменные .SD и .SDcols. Затем вы довольно просто проводите свой анализ. Надеюсь, это поможет!

...