У меня есть набор данных, который показывает 10 лучших книг с относительными изменениями цен ((p2 - p1) / p1
), как я показал ниже:
df <- tribble(
~book_id, ~p1, ~p2, ~change_in_p,
1, 3, 5, 0.667,
2, 4, 6, 0.5,
3, 8, 9, 0.125,
4, 1, 1, 0,
5, 3, 4, 0.333,
6, 8, 8, 0,
7, 3, 5, 0.667,
8, 4, 6, 0.5,
9, 8, 9, 0.125,
10, 1, 1, 0,
)
Теперь я хочу объединить изменения цен в 4 взаимоисключающие группы:
1. No change
2. <50% increase
3. 50 - 69.99% increase
4. >=70% increase
и в соответствии с топ-2, топ-5, топ-7 и топ-10 книг.
Например, процент книг в топ-2, которые увеличились в цене на 0% это 0%. Оба (100%) выросли в цене на 51–70%.
Для топ-5 20% (1/5) не изменились, 40% увеличились на <50% и 40% увеличились на 50 и 69% et c. </p>
Вот нужные данные:
desired_df <- tribble(
~top, ~no_change, ~betw_0.0001_5_perc_change, ~betw_5_7_perc_change, ~more_7_per_change,
'top2', "0%", "0%", '100%', '0%',
'top5', "20%", "40%", '40%', '0%',
'top7', "28.6%", "28.6%", '42.9%', '0%',
'top10', "30%", "30%", '40%', '0%',
)
Что я делал до сих пор?
С Я не мог сгруппировать книги, такие как top 2, top5, top7, top10, я в основном просмотрел все данные:
labels = c('less_5_perc_change', 'betw_5_7_perc_change', 'more_7_per_change')
df%>%
group_by(cols = cut(change_in_p, breaks = c(-Inf, 0.49, 0.69, Inf), labels = labels)) %>%
summarise(n = n_distinct(book_id)) %>%
mutate(pct = scales::percent(n/sum(n), 1)) %>%
pivot_wider(id_cols = cols, names_from = cols, values_from = pct)
К сожалению, мне не удалось получить желаемые данные.