Поскольку я говорил о читабельности в своем комментарии, я чувствовал, что должен предоставить что-то более читаемое в качестве ответа.
Позволяет создать несколько фиктивных данных:
data_test <- data.frame(matrix(rnorm(100, 10, 1), ncol = 5, byrow = T), stringsAsFactors = F)
Позволяет применить шапиро.test для каждого столбца
apply(data_test, 2, shapiro.test)
В случае, если есть не числовые столбцы:
Позволяет добавить столбец фиктивного символа для целей тестирования
data_test$non_numeric <- sample(c("hello", "hi", "good morning"), NROW(data_test), replace = T)
и попробоватьчтобы применить тест снова
apply(data_test, 2, shapiro.test)
, в результате чего:
> apply(data_test, 2, shapiro.test)
Error: is.numeric(x) is not TRUE
Чтобы решить эту проблему, мы выбираем только числовые столбцы с помощью sapply:
data_test[which(sapply(data_test, is.numeric))]
и объединяемэто с применением:
apply(data_test[which(sapply(data_test, is.numeric))], 2, shapiro.test)
Удаление столбцов, которые все являются NA:
data_test_numerics_only <- data_test[which(sapply(data_test, is.numeric))]
Выбор столбцов как минимум с 3 не пропущенными значениями и применение shapiro.test к ним:
data_test_numerics_only_filled_colums = data_test_numerics_only[which(apply(data_test_numerics_only, 2, function(f) sum(!is.na(f)) >= 3))]
apply(data_test_numerics_only_filled_colums, 2, shapiro.test)
Мы запустим это, давайте попробуем еще раз:)
удалить нечисловые столбцы
Betula_numerics <- Betula[which(sapply(Betula, is.numeric))]
Удалить столбцы с менее чем 3 значениями
Betula_numerics_filled <- Betula_numerics[which(apply(Betula_numerics, 2, function(f) sum(!is.na(f)) >= 3))]
Удаление столбцов с нулевой дисперсией
Betula_numerics_filled_not_constant <- Betula_numerics_filled [apply(Betula_numerics_filled , 2, function(f) var(f, na.rm = T) != 0)]
Shapiro.test и надежда на лучшее :)
apply(Betula_numerics_filled_not_constant, 2, shapiro.test)