我想获得一个数据框,该数据框是按天(但在一天的“结束”时)销售的商品总数的计数。
例如,我有以下数据:
Item Day Facility
Item_A Day1 B
Item_B Day1 A
Item_B Day1 B
Item_C Day2 B
Item_A Day2 A
Item_C Day2 C
Item_B Day2 A
Item_B Day2 A
Item_C Day3 A
我想要一个表,该表显示当天结束+前几天的总销售商品。我包含了一个虚拟列,因为我的数据还有其他不需要的列。
例如:
Item Day Facility Item_Total_Accumulative
Item_A Day1 B 1
Item_B Day1 A 2
Item_B Day1 B 2
Item_C Day2 B 2
Item_A Day2 A 2
Item_C Day2 C 2
Item_B Day2 A 4
Item_B Day2 A 4
Item_C Day3 A 3
谢谢!
答案 0 :(得分:2)
您可以使用group_by()
和mutate()
(或count()
)来计算每天和每个项目,对于计算,我认为函数cumsum()
将(累计)。
由于您的变量Facility
不是数字,因此我添加了变量Value = 1
,但是使用count()
是更好的方法(与注释行相同的结果)。
然后只用先前的结果制作一个left_join()
,您就可以找到所需的内容。
library(dplyr)
df %>%
count(Item, Day) %>%
group_by(Item) %>%
mutate(Item_Total_Accumulative = cumsum(n)) %>%
select(-n) %>%
left_join(df,.)
#> Joining, by = c("Item", "Day")
#> Item Day Facility Item_Total_Accumulative
#> 1 Item_A Day1 B 1
#> 2 Item_B Day1 A 2
#> 3 Item_B Day1 B 2
#> 4 Item_C Day2 B 2
#> 5 Item_A Day2 A 2
#> 6 Item_C Day2 C 2
#> 7 Item_B Day2 A 4
#> 8 Item_B Day2 A 4
#> 9 Item_C Day3 A 3
答案 1 :(得分:1)
应该有一种更简单的方法,但是我的快速涂鸦是这样显示的:
library(dplyr)
library(tidyr)
df %>%
group_by(Day, Item) %>%
count() %>%
group_by(Item) %>%
mutate(Item_Total_Accumulative=lag(n, default = 0) + n) %>%
group_by(Day, Item, Item_Total_Accumulative) %>%
expand(n=1:n) %>%
select(-n)
#> # A tibble: 9 x 3
#> # Groups: Day, Item, Item_Total_Accumulative [6]
#> Day Item Item_Total_Accumulative
#> <fct> <fct> <dbl>
#> 1 Day1 Item_A 1
#> 2 Day1 Item_B 2
#> 3 Day1 Item_B 2
#> 4 Day2 Item_A 2
#> 5 Day2 Item_B 4
#> 6 Day2 Item_B 4
#> 7 Day2 Item_C 2
#> 8 Day2 Item_C 2
#> 9 Day3 Item_C 3
由reprex package(v0.3.0)于2019-06-05创建