Задание 1

Задание: Сформировать собственный датасет с помощью функции c() (конкатенация), содержащий числовые данные и значения NA.

# Создаем числовой вектор с пропущенными значениями
x <- c(10, 15, NA, 20, NA, 30)


# Выводим результат
x
## [1] 10 15 NA 20 NA 30

Пояснение

Функция c() объединяет элементы в один вектор.

NA обозначает пропущенное (отсутствующее) значение.

Вектор x является простейшим датасетом с пропусками.

Задание 2

Задание: Провести очистку данных с использованием функции is.na() и вывести «чистый» датасет.

# Проверяем, какие элементы являются NA
is.na(x)
## [1] FALSE FALSE  TRUE FALSE  TRUE FALSE
# Удаляем NA значения
x_clean <- x[!is.na(x)]


# Выводим очищенный вектор
x_clean
## [1] 10 15 20 30

Пояснение

is.na(x) возвращает логический вектор (TRUE для NA).

Оператор ! инвертирует логические значения.

В результате x_clean содержит только реальные числовые значения.

Задание 3

Сгенерировать таблицу данных с числовыми и текстовыми столбцами и очистить её с помощью complete.cases().

# Создаем таблицу данных
df <- data.frame(
age = c(20, 25, NA, 30),
name = c("Aboriy", "Ivan", "Oleg", NA)
)


# Исходная таблица
df
##   age   name
## 1  20 Aboriy
## 2  25   Ivan
## 3  NA   Oleg
## 4  30   <NA>
# Оставляем только полные строки
df_clean <- df[complete.cases(df), ]


# Очищенная таблица
df_clean
##   age   name
## 1  20 Aboriy
## 2  25   Ivan

Пояснение

data.frame() создает таблицу данных.

complete.cases() возвращает TRUE только для строк без пропусков.

В итоговой таблице удаляются строки, содержащие хотя бы одно NA.

Задание 4

Проанализировать датасет airquality и заполнить пропуски с помощью функции preProcess из пакета caret (среднее и медиана).

# Подключаем пакет caret
library(caret)
## Warning: пакет 'caret' был собран под R версии 4.5.2
## Загрузка требуемого пакета: ggplot2
## Загрузка требуемого пакета: lattice
# Загружаем встроенный датасет
data(airquality)


# Просматриваем количество пропусков
colSums(is.na(airquality))
##   Ozone Solar.R    Wind    Temp   Month     Day 
##      37       7       0       0       0       0
# Импутация медианными значениями
preproc_median <- preProcess(airquality, method = "medianImpute")
airquality_median <- predict(preproc_median, airquality)


# Проверяем, остались ли NA

Пояснение

airquality содержит реальные пропуски в данных.

preProcess(…, method = “medianImpute”) вычисляет медианы.

predict() подставляет медианные значения вместо NA.

Задание 5

Сгенерировать два числовых набора данных, добавить выбросы, обнаружить и удалить их.

# Генерируем данные
set.seed(123)
x <- c(rnorm(100, mean = 50, sd = 5), 150)
y <- c(rnorm(100, mean = 30, sd = 3), -20)

x
##   [1]  47.19762  48.84911  57.79354  50.35254  50.64644  58.57532  52.30458
##   [8]  43.67469  46.56574  47.77169  56.12041  51.79907  52.00386  50.55341
##  [15]  47.22079  58.93457  52.48925  40.16691  53.50678  47.63604  44.66088
##  [22]  48.91013  44.86998  46.35554  46.87480  41.56653  54.18894  50.76687
##  [29]  44.30932  56.26907  52.13232  48.52464  54.47563  54.39067  54.10791
##  [36]  53.44320  52.76959  49.69044  48.47019  48.09764  46.52647  48.96041
##  [43]  43.67302  60.84478  56.03981  44.38446  47.98558  47.66672  53.89983
##  [50]  49.58315  51.26659  49.85727  49.78565  56.84301  48.87115  57.58235
##  [57]  42.25624  52.92307  50.61927  51.07971  51.89820  47.48838  48.33396
##  [64]  44.90712  44.64104  51.51764  52.24105  50.26502  54.61134  60.25042
##  [71]  47.54484  38.45416  55.02869  46.45400  46.55996  55.12786  48.57613
##  [78]  43.89641  50.90652  49.30554  50.02882  51.92640  48.14670  53.22188
##  [85]  48.89757  51.65891  55.48420  52.17591  48.37034  55.74404  54.96752
##  [92]  52.74198  51.19366  46.86047  56.80326  46.99870  60.93666  57.66305
##  [99]  48.82150  44.86790 150.00000
y
##   [1]  27.86878  30.77065  29.25992  28.95737  27.14514  29.86492  27.64529
##   [8]  24.99617  28.85932  32.75699  28.27396  31.82389  25.14635  29.83331
##  [15]  31.55822  30.90346  30.31703  28.07788  27.45089  26.92761  30.35294
##  [22]  27.15758  28.52833  29.23172  35.53159  28.04415  30.70616  30.23388
##  [29]  27.11443  29.78608  34.33365  31.35451  30.12370  28.73251  23.84026
##  [36]  33.39401  25.61808  32.21984  35.72731  25.66832  32.10535  29.21341
##  [43]  25.28357  25.45600  25.19539  28.40728  25.61473  32.06375  36.30033
##  [50]  26.13891  32.36322  32.30713  30.99661  26.97487  29.64164  29.15881
##  [57]  31.68897  28.88268  32.93092  28.87626  33.15813  26.85247  26.21953
##  [64]  39.72312  28.74943  30.89468  31.90971  28.54866  31.55059  31.10689
##  [71]  29.35386  30.19588  29.89780  36.38536  27.77599  26.71201  30.11337
##  [78]  30.93144  31.30957  28.62490  26.81002  33.78956  28.95105  27.40346
##  [85]  29.29116  29.40847  33.32976  30.25421  32.26216  28.50212  30.64334
##  [92]  29.02594  30.28375  27.31391  26.06760  35.99164  31.80213  26.24619
##  [99]  28.16650  26.44356 -20.00000
# Построение boxplot
boxplot(x, main = "Выбросы в x")

# Определение выбросов
out_x <- boxplot.stats(x)$out


# Удаление выбросов
x_clean <- x[!x %in% out_x]

Пояснение Функция set.seed() фиксирует начальное состояние генератора случайных чисел. При использовании генераторов случайных чисел (rnorm, runif и т.д.) результаты могут отличаться при каждом запуске. Установка зерна (seed) гарантирует воспроизводимость результатов — при повторном запуске кода будут получены те же самые случайные значения. x <- c(rnorm(100, mean = 50, sd = 5), 150) - Создание числового вектора x, содержащего нормальные значения и искусственно добавленный выброс.

boxplot() визуально показывает выбросы.

boxplot.stats()$out возвращает значения выбросов.

После фильтрации остаются только «нормальные» наблюдения.

Задание 6

Сгенерировать таблицу с дублирующимися строками и удалить их разными способами.

# Таблица с дубликатами
df_dup <- data.frame(
id = c(1, 2, 2, 3, 3),
value = c("A", "B", "B", "C", "C")
)


# Удаление дубликатов через unique()
unique_df <- unique(df_dup)


# Удаление дубликатов через duplicated()
df_no_dup <- df_dup[!duplicated(df_dup), ]

df_no_dup
##   id value
## 1  1     A
## 2  2     B
## 4  3     C

Пояснение

unique() сразу возвращает уникальные строки.

duplicated() дает логический вектор.

Результат одинаков, но duplicated() дает больше контроля.