Урок 3 Функции семейства apply
3.1 Описание
На предыдущем уроке мы изучили всевозможные варианты циклов в R, но вам всё время говорят о том, что не надо использовать циклы в R. Возникает вопрос, так что же использовать вместо циклов? На самом деле есть альтернатива в виде функционалов. В этом уроке мы разберёмся с функционалами в базовом синтаксисе R, которые реализованы в семействе функций apply()
.
Функционал - это функция, которая перебирает элементы объекта применяя последовательно к каждому элементу заданную функцию.
3.3 Тайм коды
00:00 Вступление.
00:48 Какие функции входят в семейство apply
.
02:22 Функция apply()
.
07:57 Передача дополнительных аргументов в применяемую внутри apply()
функцию.
09:05 Функции lapply()
, sapply()
и vapply()
.
12:09 Как использовать самописную функцию внутри функций семейства apply
.
13:23 Пример чтения данных из множества csv файла функцией lapply()
.
15:40 Функция mapply()
.
18:00 Заключение.
3.4 Код
# apply family
# пример с циклом ---------------------------------------------------------
# строки
for ( x in seq_along(1:nrow(mtcars)) ) {
cat(rownames(mtcars[x,]), ":", sum(mtcars[x,]), "\n")
}
# столбцы
col_num <- 1
for ( x in mtcars ) {
cat(names(mtcars)[col_num], ":", sum(x), "\n")
col_num <- col_num + 1
}
# apply -------------------------------------------------------------------
# 1 - строки
# 2 - столюцы
apply(mtcars, 1, sum)
apply(mtcars, 2, sum)
sum(mtcars[3, ])
sum(mtcars[ ,3])
# row operation -----------------------------------------------------------
rowSums(mtcars)
rowMeans(mtcars)
# передача дополнительных аргументов --------------------------------------
apply(mtcars, 2, quantile, probs = 0.25)
quantile(mtcars[, 3], probs = 0.25)
# lapply ------------------------------------------------------------------
values <- list(
x = c(4, 6, 1),
y = c(5, 10, 1, 23, 4),
z = c(2, 5, 6, 7)
)
lapply(values, sum)
sapply(values, sum)
vapply(values, sum, FUN.VALUE = 7)
# lapply с самописной функцией --------------------------------------------
fl <- function(x) {
num_elements <- length(x)
return(x[1] + x[num_elements])
}
lapply(values, fl)
# пример чтения файлов ----------------------------------------------------
directory <- 'C:/Users/Alsey/Documents/docs/'
files <- dir(path = directory, pattern = '\\.csv$')
all_data <- list()
# цикл
for ( file in files ) {
data <- read.csv(paste0(directory, file))
all_data <- append(all_data, list(data))
}
dplyr::bind_rows(all_data)
# lapply
file_paths <- paste0(directory, files)
all_data <- lapply(file_paths, read.csv)
dplyr::bind_rows(all_data)
# mapply ------------------------------------------------------------------
mapply(rep, 1:4, times=4:1)
mapply(rep, times = 1:4, x = 4:1)
3.7 Дополнительные материалы
- Статья “Векторизованные вычисления в R с использованием apply-функций” (Сергей Мастицкий).