Урок 3 Функции семейства apply

3.1 Описание

На предыдущем уроке мы изучили всевозможные варианты циклов в R, но вам всё время говорят о том, что не надо использовать циклы в R. Возникает вопрос, так что же использовать вместо циклов? На самом деле есть альтернатива в виде функционалов. В этом уроке мы разберёмся с функционалами в базовом синтаксисе R, которые реализованы в семействе функций apply().

Функционал - это функция, которая перебирает элементы объекта применяя последовательно к каждому элементу заданную функцию.

3.2 Видео

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.6 Тест

3.7 Дополнительные материалы