Задание: Сформировать собственный датасет с помощью функции c() (конкатенация), содержащий числовые данные и значения NA.
# Создаем числовой вектор с пропущенными значениями
x <- c(10, 15, NA, 20, NA, 30)
# Выводим результат
x
## [1] 10 15 NA 20 NA 30
Пояснение
Функция c() объединяет элементы в один вектор.
NA обозначает пропущенное (отсутствующее) значение.
Вектор x является простейшим датасетом с пропусками.
Задание: Провести очистку данных с использованием функции 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 содержит только реальные числовые значения.
Сгенерировать таблицу данных с числовыми и текстовыми столбцами и очистить её с помощью 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.
Проанализировать датасет 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.
Сгенерировать два числовых набора данных, добавить выбросы, обнаружить и удалить их.
# Генерируем данные
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 возвращает значения выбросов.
После фильтрации остаются только «нормальные» наблюдения.
Сгенерировать таблицу с дублирующимися строками и удалить их разными способами.
# Таблица с дубликатами
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() дает больше контроля.