首页 > 解决方案 > 考虑“缺失”值,处理应输入 0 的实例

问题描述

好的,所以我知道这看起来像一百万个相同类型的其他问题。但我不认为我见过一个有这个确切问题的人,所以我在这里哈哈。

假设您有一个按客户、sku 和日期划分的销售数据框。世界上一切都很好。但是,如果你有这个 df,它是巨大的(数百个客户,如果我们想进一步惩罚自己,每个星期都有数百个 sku)。然后,在按客户、sku 和周分组后,再进行总结,我们意识到并非所有客户每周都购买所有 sku。这使事情复杂化。

例如,如果没有为每个未购买的 sku 的收入值为 0 的客户每周输入一行,则使用 geom_line 和 geom_smooth 进行绘图变得不准确。这些线继续其轨迹,而不是下降到零。

我现在可能只是非常愚蠢,但是每次有一周的任何给定客户都没有购买 sku 时,我如何介绍所有这些收入为 0 的条目,以便获得我需要的适当图表?还是有一种完全不同的方式来处理这类事情?

# 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()

我不知道在图中是否有一种简单的方法来处理这个问题?否则,我需要在收入列中为客户未购买的 sku 每周添加 0。如果是这样的话,有没有一种有效的方法来做到这一点?一如既往的感谢!

标签: rdataframeplot

解决方案


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()

推荐阅读