Как распечатать минимум и максимум сводной статистики на уровне факторов (взяв минимум и максимум медианы / пропорции)?

У меня есть следующие данные, включая 10 продуктов (a, b, c, ...) и их описания (другие переменные).

Мне нужно сообщить, как сводная статистика других переменных (медиана / пропорция) варьируется между продуктами (должна быть напечатана как минимум и максимум для каждого значения сводной статистики).

Например:

У какого продукта самая низкая и самая высокая средняя цена (необходимо указать только два значения, названия продуктов не имеют значения).

Какой продукт имеет самую низкую и самую высокую долю плохих оценок (необходимо указать только два значения, названия продуктов не имеют значения).

Есть ли простой способ его закодировать? Мои фактические данные содержат 10 000 товаров и 150 других переменных, просмотр сводных таблиц убил бы меня.

Данные

```{r}
data.frame(
product = rep(letters[1:10], each = 2, times = 500),
price = rnorm(1000, 100, 30),
weight = rnorm(1000, 8, 2),
price_category = rep(c("expensive", "cheap"), each = 4, times = 250),
rating = replicate(1,sample(c("good", "bad"),1000,rep=TRUE)))
```

введите описание изображения здесь


person st4co4    schedule 12.09.2020    source источник


Ответы (2)


Вы можете заглянуть в пакет dplyr, который поможет вам ответить на такие вопросы.

  1. У какого товара самая низкая и самая высокая средняя цена
library(dplyr)
df %>%
  group_by(product) %>%
  summarise(median_price = median(price)) %>%
  slice(which.min(median_price), which.max(median_price))

#  product median_price
#  <chr>          <dbl>
#1 f               91.9
#2 e              107. 
  1. Какой продукт имеет самую низкую и самую высокую долю плохих оценок
df %>%
  group_by(product) %>%
  summarise(prop_of_bad_ratings = mean(rating == 'bad')) %>%
  slice(which.min(prop_of_bad_ratings), which.max(prop_of_bad_ratings))

#  product prop_of_bad_ratings
#  <chr>                 <dbl>
#1 j                      0.44
#2 c                      0.55
person Ronak Shah    schedule 12.09.2020
comment
Спасибо! Это кажется очень многообещающим. Еще две вещи. Есть ли способ суммировать сразу все непрерывные переменные? Во-вторых, рейтинг - это категориальная переменная. Как узнать соотношение хороших и плохих оценок для каждого продукта, а затем указать их минимальные и максимальные значения? - person st4co4; 12.09.2020
comment
Подводя итог, вы имеете в виду взять median для всех? Вы можете использовать df %>% group_by(product) %>% summarise(across(where(is.numeric), median)) для этого. Для второго вопроса вы можете сделать то же самое, что и ответ 2 выше, и для рейтинга 'good', а затем при необходимости объединить результаты. - person Ronak Shah; 12.09.2020

Вы также можете использовать таблицу данных. Оператор := выполняет присвоение на месте (в данном случае создает новый столбец медианы) путем группировки по столбцу цены с аргументом by. Затем вы можете просто найти минимальное и максимальное значения. Оператор .N получает количество значений данных.

library(data.table)
  
dt <- data.table(data.frame(
    product = rep(letters[1:10], each = 2, times = 500),
    price = rnorm(1000, 100, 30),
    weight = rnorm(1000, 8, 2),
    price_category = rep(c("expensive", "cheap"), each = 4, times = 250),
    rating = replicate(1,sample(c("good", "bad"),1000,rep=TRUE))))
  
dt[, medians := median(price), by=product]

# Highest and lowest median price
dt[c(which.min(medians), which.max(medians)), medians]

# Calculate proportions of each product
dt[, prodcount := .N, by=product]
dt[, percent := 100 * (.N / prodcount), by=.(rating, product)]
bad <- dt[rating == 'bad',]
bad[c(which.min(percent), which.max(percent))]
person at80    schedule 12.09.2020