Учет «отсутствующих» значений, работа со случаями, когда следует вводить 0

Итак, я знаю, что это похоже на миллион других проблем того же типа. Но я не думаю, что видел кого-то именно с такой проблемой, так что вот я, ха-ха.

Допустим, у вас есть данные о продажах по клиентам, артикулам и дате. Все хорошо в мире. Но что, если бы у вас был этот df, он был огромным (сотни клиентов, а если мы хотели наказать себя дальше, сотни SK каждый, каждую неделю). Затем, после группировки по клиентам, артикулам и неделям, а затем подведения итогов, мы понимаем, что не все артикулы покупаются всеми клиентами каждую неделю. Это все усложняет.

Например, без записи строки для каждой недели по покупателю со значением дохода, равным 0, для каждого не купленного артикула, построение графика с помощью geom_line и geom_smooth становится неточным. линии продолжают двигаться по своей траектории, а не падают до нуля.

Я могу быть очень глупым прямо сейчас, но как мне представить все эти записи с нулевым доходом каждый раз, когда есть неделя, когда ни один из клиентов не купил артикул, чтобы я мог получить соответствующие графики, которые мне нужны? Или есть совершенно другой способ борьбы с такими вещами?

# Extremely simplified
# Plot from DF WO zeros

df_plot<- data.frame(x=c(1,2,3,4,5,10), y=c(1,2,3,4,5,10))
ggplot(df_plot,aes(x,y))+
  geom_point()+
  geom_smooth()+
  geom_line()

# Theoretical plot where we have zeros where no sales were made

df_plot2<- data.frame(x=c(1,2,3,4,5,6,7,8,9,10), y=c(1,2,3,4,5,0,0,0,0,10))
ggplot(df_plot2,aes(x,y))+
  geom_point()+
  geom_smooth()+
  geom_line()

Я не знаю, есть ли простой способ справиться с этим на графике? В противном случае мне нужно добавить 0 в столбец доходов за каждую неделю, когда клиент не купил артикул. Если это так, есть ли эффективный способ сделать это? Как всегда спасибо!

Я должен сказать, представьте, что x выше — номер недели, а y — доход.

Ryan G 29.05.2019 21:03
?tidyr::complete чтобы добавить 0s. Вам решать, хотите ли вы добавить 0 ко всему фрейму данных или к каждому маленькому фрейму данных при его построении.
Gregor Thomas 29.05.2019 21:04

Может быть, вы можете использовать ifelse

programandoconro 29.05.2019 21:27

Спасибо, Грегор! Это именно то, что мне было нужно

Ryan G 31.05.2019 18:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете заполнить пропущенные значения для уровней факторной переменной или непрерывной переменной, которые отсутствуют в наборе данных, с помощью tidyr::complete и tidyr::full_seq.

В вашем случае, я думаю, вы хотите:

# Load required packages.
library(ggplot2)
library(tidyr)

# Create data frame with 0 values omitted.
df_plot<- data.frame(x=c(1,2,3,4,5,10), y=c(1,2,3,4,5,10))
ggplot(df_plot,aes(x,y))+
  geom_point()+
  geom_smooth()+
  geom_line()

# Fill gap in continuous variable with 0's and plot. 
df_plot %>% 
  complete(x = full_seq(x, 1), fill = list(y = 0)) %>% 
  ggplot(., aes(x, y)) +
  geom_point() +
  geom_smooth() +
  geom_line()

Кроме того, вы можете сделать это с помощью функции statar пакета fill_gap:

df_plot %>% 
statar::fill_gap(x, full = TRUE) %>% 
  replace_na(list(y = 0)) %>% 
  ggplot(., aes(x, y)) +
  geom_point() +
  geom_smooth() +
  geom_line()

Другие вопросы по теме