Решение задач на программирование (solutions)
В этом разделе приведены примеры решений представленных в курсе практических задач. Т.е. данный раздел предназначен для того, что бы вы могли сравнить свои решения с приведёнными тут, или же найти подсказку, если в течении длительного времени у вас не получается решить какую-либо из практических задач.
Урок 6
Задание 4
library(dplyr)
# создаём набор данных
set.seed(50)
<- tibble(col1 = sample(c("a", "b", "c"), size = 50, replace = TRUE),
df col2 = rnorm(n = 50, 5, 10),
col3 = runif(n = 50, 15, 50),
col4 = sample(letters, 50, TRUE),
col5 = sample(LETTERS, 50, TRUE))
# решение
%>%
df group_by(col1) %>% # группируем
summarise(avg = mean(col2)) %>% # считаем среднее
filter(col1 == 'b') %>% # фильтруем по нужной группе
select(avg) # выбираем нужный столбец
Урок 7
Задание 3
# код для генерации таблиц
library(dplyr)
set.seed(50)
<- tibble(xkey = sample(c("a", "c", "d"), size = 150, replace = TRUE),
xdf count = sample(2:10, 150, TRUE))
<- tibble(xcode = c("a", "b", "c", "d", "e"),
ydf name = c("banan", "apple", "orange", "kiwi", "cherry"),
price = c(4.3, 2.1, 3.3, 4.7, 3.7))
# решение
left_join(
xdf,
ydf,by = c("xkey" = "xcode")
%>%
) mutate(
sum = count * price
%>%
) group_by(name) %>%
summarise(total = sum(sum)) %>%
filter(name == "kiwi")
Урок 8
Задание 2
library(dplyr)
# создаём таблицу с которой будем работать
set.seed(50)
<- tibble(step = rep(1:60, 2),
df group = c(rep("A", 60), rep("B", 60)),
val = round(runif(120, 100, 1000), 0)) %>%
arrange(step)
# объект в который запишем результат вычислений
# нарастающий итог обязательно надо записывать в столбец run
<- df %>%
res group_by(group) %>%
mutate(run = cumsum(val))
# выводим в консоль результат который надо скопировать и вставить в виде ответа
%>%
res filter( step %in% c(4, 32, 18) & group == "A" | step %in% c(10, 48, 51) & group == "B") %>%
arrange( group, step ) %>%
$run %>%
. cat
Задание 3
library(dplyr)
# создаём таблицу с которой будем работать
set.seed(50)
<- tibble(step = rep(1:60, 2),
df group = c(rep("A", 60), rep("B", 60)),
val = round(runif(120, 100, 1000), 0)) %>%
arrange(step)
# решение
%>%
df group_by(group) %>%
mutate(growth = val - lag(val)) %>%
summarise(avg_growth = mean(growth, na.rm=TRUE)) %>%
filter(group == "B") %>%
select(avg_growth)
Урок 9
Задание 2
library(dplyr)
library(tidyr)
set.seed(50)
<- tibble(shop = c("starMarket", "euroshop", "wowsales"),
df jan = runif(3, 10000, 25000),
feb = runif(3, 10000, 25000),
mar = runif(3, 10000, 25000),
apr = runif(3, 10000, 25000),
may = runif(3, 10000, 25000),
jun = runif(3, 10000, 25000),
jul = runif(3, 10000, 25000),
aug = runif(3, 10000, 25000),
sep = runif(3, 10000, 25000),
oct = runif(3, 10000, 25000),
nov = runif(3, 10000, 25000),
dec = runif(3, 10000, 25000))
# решение
%>%
df pivot_longer(
:dec,
jannames_to = 'month',
values_to = "sales"
%>%
) group_by(shop) %>%
summarise(sales = sum(sales)) %>%
slice_max(sales) %>%
select(shop)
Задание 4
library(dplyr)
library(tidyr)
set.seed(50)
<-
df tibble(name = c(rep('Alex', 3), rep('John', 3), rep('Tom', 3)),
key = rep(c("sale", 'refund', 'discount'), 3),
val = c(runif(1, 1000, 2000), runif(1, 100, 250), runif(1, 50, 150),
runif(1, 1000, 2000), runif(1, 100, 250), runif(1, 50, 150),
runif(1, 1000, 2000), runif(1, 100, 250), runif(1, 50, 150)))
# решение
%>%
df pivot_wider(
names_from = key,
values_from = val
%>%
) mutate(
total_sum = sale - refund - discount
%>%
) slice_max(total_sum) %>%
select(name, total_sum)
Урок 10
Задание 2
library(jsonlite)
library(tidyr)
library(dplyr)
<- read_json(path = 'https://raw.githubusercontent.com/selesnow/r4excel_users/master/test/t10-1.json')
json
# решение
<- tibble(json = json)
json
%>%
json unnest_wider(json) %>%
group_by(department) %>%
summarise(avgage = mean(age)) %>%
filter(department == "IT") %>%
select(avgage)
Задание 3
library(jsonlite)
library(tidyr)
library(dplyr)
<- read_json(path = 'https://raw.githubusercontent.com/selesnow/r4excel_users/master/test/t10-2.json')
json
# решение
<- tibble(data = json)
data
# cредняя площадь магазина
%>%
data unnest_longer(data) %>%
unnest_wider(data) %>%
select(square) %>%
%>%
unlist mean
Задание 4
library(jsonlite)
library(tidyr)
library(dplyr)
<- read_json(path = 'https://raw.githubusercontent.com/selesnow/r4excel_users/master/test/t10-2.json')
json
# решение
<- tibble(data = json)
data
%>%
data unnest_longer(data) %>%
unnest_wider(data) %>%
unnest_longer(schedule) %>%
select(data_id, schedule_id, schedule) %>%
filter( schedule_id == 'sun' & schedule == 0) %>%
select(data_id)
Задание 5
library(tidyr)
library(dplyr)
library(readr)
library(stringr)
<- read.csv("https://raw.githubusercontent.com/selesnow/r4excel_users/master/test/production_calendar.csv")
data
# решение
%>%
data pivot_longer(January:December, names_to = "month", values_to = "days") %>%
mutate(days = str_split(days, ",")) %>%
unnest_longer(days) %>%
filter( Year %in% c(2005, 2008, 2012, 2017) & str_detect(days, "\\*") ) %>%
nrow
Урок 11
Задание 2
library(readr)
library(ggplot2)
library(dplyr)
<-
sales_data read_csv2('https://raw.githubusercontent.com/selesnow/r4excel_users/master/lesson_11/sales_data.csv')
# решение
%>%
sales_data group_by(shop, brand) %>%
summarise(count = sum(count)) %>%
qplot(data = .,
x = brand,
y = count,
fill = brand,
geom = 'col',
facets = ~ shop)