Преобразование символьного вектора в факторный
Допустим у нас есть символьный вектор, состоящий из двух значений "w" и "h", причем "w" повторяется 5 раз, а "h" два. И нам необходимо вывести количество повторений каждого символа в векторе. Попробуем воспользоваться для этого функцией summary и построить график с помощью функции plot.
x <- c(rep('w',5),rep('h',2))
x
[1] "w" "w" "w" "w" "w" "w" "h" "h"
summary(x)
Получаем на выходе для summary
Length Class Mode
8 character character
plot(x)
И ошибку для plot
Error in plot.window(...) : нужны конечные значения 'ylim'
xf <- factor(x)
summary(x)
plot(x)
h w
2 5
Перейдем к более интересным данным. Для этого загрузим датафрейм с дневными продажами розничного магазина одежды. Выведем его первые строки и структуру :
shop <- read_excel("ShopSale06.xlsx")
head(shop)
# A tibble: 6 x 6
Date Code Gender Category Season Amt
<dttm> <chr> <chr> <chr> < chr> <dbl>
1 2019-06-01 00:00:00 SQ52420 Женский Шорты Лето 1
2 2019-06-01 00:00:00 SQ54655 Мужской Шорты Лето 1
3 2019-06-01 00:00:00 SQ60070 Унисекс Аксессуары Универсал 1
4 2019-06-01 00:00:00 SQ60453 Женский Рубашка Универсал 1
5 2019-06-01 00:00:00 SQ49034 Мужской Шорты Лето 1
6 2019-06-01 00:00:00 SQ49786 Мужской Брюки Лето 1
str(shop)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 1411 obs. of 6 variables:
$ Date : POSIXct, format: "2019-06-01" "2019-06-01" "2019-06-01" ...
$ Code : chr "SQ52420" "SQ54655" "SQ60070" "SQ60453" ...
$ Gender : chr "Женский" "Мужской" "Унисекс" "Женский" ...
$ Category: chr "Шорты" "Шорты" "Аксессуары" "Рубашка" ...
$ Season : chr "Лето" "Лето" "Универсал" "Универсал" ...
$ Amt : num 1 1 1 1 1 1 1 1 1 1 ...
В этом датафрейме 1411 наблюдений по 6 переменным, с одним типом Дата четырьмя символьными и одним числовым. Каждая строка представляет продажи одного артикула в течение дня. Допустим мы хотим узнать распределение продаж по дням недели. Для этого добавим еще одну колонку WDay
shop$Wday <- wday(shop$Date, label = T)
class(shop$wday)
[1] "ordered" "factor"
Функция class показала что это
упорядоченный фактор, применим функцию summary , которая выведет нам продажи по дням недели
summary(shop$wday)
Вс Пн Вт Ср Чт Пт Сб
294 123 153 176 165 147 353
Далее хотелось бы вывести количество продаж по категориям. Выведем класс этого показателя и что с ним можно сделать без преобразований
class(shop$Category)
[1] "ordered" "factor"
summary(shop$Category)
Length Class Mode
1411 character character
unique(shop$Category)
[1] "Шорты" "Аксессуары" "Рубашка" "Брюки" "Футболка" "Платье" "Куртка" "Юбка"
[9] "Толстовка
plot(shop$Category)
выдаст ошибку
Не очень много полезной информации и далеко не то, что нам нужно. Преобразуем значения в фактор , добавим новую колонку в датафрейм и проведем подобные действия
shop$Category2 <- factor(shop$Category)
str(shop$Category2)
Factor w/ 9 levels "Брюки","Куртка",..: 8 8 4 5 8 1 5 7 5 1 ...
summary(shop$Category2)
Аксессуары Брюки Куртка Платье Рубашка Толстовка Футболка Шорты Юбка
В данном случае мы получили, то что хотели, однако и это представление можно улучшить, сделать так, чтобы категории шли по нисходящим продажам. Для этого используем функцию из пакета forcats.
shop$Category3 <- forcats::fct_infreq(shop$Category)
str(shop$Category3)
Factor w/ 9 levels "Футболка","Разное",..: 4 4 2 5 4 3 5 1 5 3 ...
summary(shop$Category3)
Футболка Аксессуары Брюки Шорты Рубашка Куртка Толстовка Платье Юбка
501 361 198 139 100 50 32 23 7
plot(shop$Category3)
Но и это еще не все, допустим мы хотим выделить три самые продаваемые категории, а остальные объединить, это можно сделать с помощью функций из того же пакета
shop$Category4 <- fct_lump(shop$Category, n = 3)
summary(shop$Category4)
Аксессуары Брюки Футболка Other
361 198 501 351
plot(shop$Category4) |
А с помощью другой функции упорядочить по продажам от большего к меньшему
shop$Category4 <- fct_infreq(fct_lump(shop$Category, n = 3))
summary(shop$Category4)
Футболка Аксессуары Other Брюки
501 361 351 198
plot(shop$Category4)
Комментариев нет:
Отправить комментарий