Привет, Хабр!

Библиотека dplyr в R позволяет манипулировать данными, проводить фильтрацию, выборку, сортировку, группировку данных и многое другое.

В этой статье как раз и рассмотрим эту библиотеку!

Для начала установим:

install.packages("dplyr")

Основные функции dplyr

Функция filter() используется для выбора строк из данных, которые соответствуют определенным условиям:

library(dplyr)

# создаем фрейм данных с информацией о студентах
students <- data.frame(
  name = c("Alice", "Bob", "Charlie", "David"),
  age = c(22, 25, 21, 24),
  grade = c("A", "B", "C", "A")
)

# фильтруем данные, чтобы выбрать студентов, старше 21 года
filtered_students <- filter(students, age > 21)
print(filtered_students)

Функция select() используется для выбора определенных столбцов из данных:

# выбираем только столбцы с именами студентов и их оценками
selected_data <- select(students, name, grade)

mutate() позволяет создавать новые переменные на основе существующих данных:

# создаем новую переменную для студентов с возрастом более 23 лет
mutated_data <- mutate(students, senior = ifelse(age > 23, "Yes", "No"))
print(mutated_data)

summarize() используется для вычисления сводной информации по данным:

# вычисляем средний возраст студентов
summary_data <- summarize(students, average_age = mean(age))
print(summary_data)

arrange() используется для сортировки данных по определенным столбцам:

# сортируем студентов по возрасту по возрастанию
sorted_data <- arrange(students, age)
print(sorted_data)

Работа с группами данных

group_by() используется для группировки данных по одному или нескольким столбцам:

library(dplyr)

# создаем фрейм данных с информацией о продажах
sales <- data.frame(
  product = c("A", "B", "A", "B", "A"),
  amount = c(100, 150, 200, 120, 180)
)

# группируем данные по продукту
grouped_sales <- group_by(sales, product)
print(grouped_sales)

После группировки данных можно применить summarize() для вычисления статистик по каждой группе:

summary_data <- summarize(grouped_sales, avg_sales = mean(amount))
print(summary_data)

Можно вычислить несколько статистик сразу для каждой группы, снова юзая summarize():

summary_data <- summarize(grouped_sales, 
                           avg_sales = mean(amount),
                           max_sales = max(amount))
print(summary_data)

Конечно, можно выполнять и другие операции, например, фильтрацию или создание новых переменных:

# фильтрация данных для каждой группы, оставляя только значения выше среднего
filtered_data <- grouped_sales %>%
  filter(amount > mean(amount))
print(filtered_data)

Слияние и объединение данных

Методы объединения данных:

  1. left_join(): объединение данных по ключу из первого (левого) набора данных.

  2. right_join(): объединение данных по ключу из второго (правого) набора данных.

  3. inner_join(): возвращает только строки, которые имеют совпадающие значения ключей в обоих наборах данных.

  4. full_join(): возвращает все строки из обоих наборов данных, дополняя пропущенные значения NA, если данных не хватает.

# пример
df1 <- data.frame(id = c(1, 2, 3),
                  name = c("Ivan", "Kolya", "Nastya"))
df2 <- data.frame(id = c(2, 3, 4),
                  age = c(25, 30, 35))

# left_join(): объединяем данные по ключу "id", оставляя все строки из df1
left_merged <- left_join(df1, df2, by = "id")
print(left_merged)

# right_join(): объединяем данные по ключу "id", оставляя все строки из df2
right_merged <- right_join(df1, df2, by = "id")
print(right_merged)

# inner_join(): объединяем данные по ключу "id", оставляя только строки с совпадающими значениями ключа
inner_merged <- inner_join(df1, df2, by = "id")
print(inner_merged)

# full_join(): объединяем данные по ключу "id", возвращая все строки из обоих наборов данных
full_merged <- full_join(df1, df2, by = "id")
print(full_merged)

Примеры использования

Анализ данных о продажах:

library(dplyr)

# грузим данные о продажах
sales_data <- read.csv("sales_data.csv")

# фильтрация данных для определенного периода времени
sales_filtered <- sales_data %>%
  filter(Date >= as.Date("2023-01-01") & Date <= as.Date("2024-12-31"))

# группировка данных по продукту и вычисление суммарных продаж
sales_summary <- sales_filtered %>%
  group_by(Product) %>%
  summarise(Total_Sales = sum(Sales))

print(sales_summary)

Обработка данных клиентов:

library(dplyr)

customer_data <- read.csv("customer_data.csv")

# фильтрация данных для определенной страны
customer_filtered <- customer_data %>%
  filter(Country == "Spain")

# создание новой переменной для расчета возраста клиентов
customer_processed <- customer_filtered %>%
  mutate(Age = year(now()) - Year_of_Birth)

# выборка нужных столбцов
customer_selected <- customer_processed %>%
  select(Name, Age, Gender, Email)

print(customer_selected)

Небольшой анализ трафика сайта:

library(dplyr)

web_traffic <- read.csv("web_traffic.csv")

# фильтрация данных для определенной страны и периода времени
traffic_filtered <- web_traffic %>%
  filter(Country == "USA", Date >= as.Date("2023-01-01"))

# вычисление средней продолжительности сеанса
average_session_duration <- traffic_filtered %>%
  summarise(Avg_Session_Duration = mean(Session_Duration))

print(average_session_duration)

Сводная статистика по сотрудникам и их ЗП:

library(dplyr)

employee_data <- read.csv("employee_data.csv")

# группировка данных по отделу и вычисление средней зарплаты
salary_summary <- employee_data %>%
  group_by(Department) %>%
  summarise(Avg_Salary = mean(Salary))

# сортировка результатов по убыванию средней зарплаты
salary_summary_sorted <- salary_summary %>%
  arrange(desc(Avg_Salary))

print(salary_summary_sorted)

Все необходимые инструменты и методы для манипуляции с данными и анализа можно освоить на онлайн-курсах OTUS: в каталоге можно посмотреть список всех программ, а в календаре — записаться на открытые уроки.

Комментарии (1)


  1. BogdanPetrov
    04.05.2024 10:49
    +1

    С одной стороны, очередное упоминание R и dplyr это круто. С другой стороны - заметка странноватая и непонятно для кого. Новичкам вряд ли будет что-то понятно, так как нет ни слова про оператор %>%. Приведены функции dplyr, но не все и нет ссылки на документацию: https://dplyr.tidyverse.org/reference/index.html. Для чтения CSV используется read.csv, вместо readr::read_csv из того же Tidyverse.