我在R df
中有一个数据框,如下所示:
PROD STORE WEEK
13700023740 227587 1534
13700023740 227588 1534
13700023740 227589 1534
13700023740 227590 1534
13700023740 227591 1534
13700023740 227588 1535
13700023740 227589 1535
13700023740 227590 1535
13700023740 227591 1535
13700023740 227592 1535
13700023740 227593 1535
13700023740 227594 1535
13700023740 227591 1536
13700023740 227592 1536
13700023740 227593 1536
13700023740 227594 1536
13700023740 227595 1536
13700023740 227596 1536
13700023740 227597 1536
13700023740 227598 1536
13700023740 227599 1536
13700023740 227600 1536
13700023740 227596 1537
13700023740 227597 1537
13700023740 227598 1537
13700023740 227599 1537
13700023740 227600 1537
13700023740 227601 1537
13700023740 227602 1537
13700023740 227603 1537
13700023740 227604 1537
13700023740 227605 1537
13700023740 227606 1537
13700023740 227607 1537
13700023740 227608 1537
13700023740 227609 1537
13700023740 227610 1537
PROD
代表产品ID,STORE
代表商店ID,WEEK
代表一周。我想使用new_df
group_by
和PROD
和三列WEEK
,Entry
和{{1}创建一个新的数据框Exit
}。 Total
应提供Entry
在特定一周内进入的新商店数。 PROD
应提供该周退出的商店Exit
的数量。 PROD
应提供该周内Total
可用的商店总数。上述数据片段的预期样本输出如下:
PROD
我想出了如何使用以下方法获取>new_df
PROD WEEK Entry Exit Total
13700023740 1534 5 0 5
13700023740 1535 3 1 7
13700023740 1536 6 3 10
13700023740 1537 10 5 15
列中的计数:
Total
有人可以建议如何获得其他两列吗?
主要编辑:链接到包含的真实数据集和已集成到问题中的评论(不要从原始帖子中删除示例数据,以完整地了解与@Moody_Mudskipper进行的讨论)
在评论部分的讨论中,我附加了真实数据集here,因为原始帖子中的样本数据未涵盖某些关键方面。这是.rda文件。
1)df %>% group_by(PROD,WEEK) %>% summarise(Total = n_distinct(STORE))
-WEEK
组合的PROD
值并不总是连续的。
2)在特定的STORE
中丢失后,STORE
的值可能会重新出现PROD
。由于它是销售交易数据,因此如果WEEK
中PROD
中的WEEK
中没有STORE
的销售,则相应的{{1 }},但可能会在随后的几周内出现。例如,对于STORE
13700023740,WEEK
1535中缺少PROD
227587,但是在STORE
1545、1550中可能有227587等。{{1}的最大可能值}是1739。因此,WEEK
在1739年或之前的几周内的任何新值都是WEEK
的条目计数。
3)要计算出口,将最后一个WEEK
(其值为{{1})之后的STORE
视为出口PROD
。例如,如果WEEK
的{{1}} 227587的最后WEEK
是1630,那么我们可以将1631视为STORE
227587的出口周。在此,最大可能任何WEEK
-WEEK
组合中的STORE
是1739。
答案 0 :(得分:1)
如果您的预期输出的最后一行出现错误,我相信应该这样做:
library(dplyr)
df %>% mutate(Entry = !duplicated(STORE),
Exit = !duplicated(STORE,fromLast = TRUE)) %>%
group_by(PROD, WEEK) %>%
summarize(Entry = sum(Entry),
Exit= sum(Exit),
Total = n()) %>%
mutate(Exit = c(0,head(Exit,-1)))
# # A tibble: 4 x 5
# # Groups: PROD [1]
# PROD WEEK Entry Exit Total
# <dbl> <int> <int> <dbl> <int>
# 1 13700023740 1534 5 0 5
# 2 13700023740 1535 3 1 7
# 3 13700023740 1536 6 3 10
# 4 13700023740 1537 7 5 12
数据
df <- read.table(header=TRUE,stringsAsFactors=FALSE,text="PROD STORE WEEK
13700023740 227587 1534
13700023740 227588 1534
13700023740 227589 1534
13700023740 227590 1534
13700023740 227591 1534
13700023740 227588 1535
13700023740 227589 1535
13700023740 227590 1535
13700023740 227591 1535
13700023740 227592 1535
13700023740 227593 1535
13700023740 227594 1535
13700023740 227591 1536
13700023740 227592 1536
13700023740 227593 1536
13700023740 227594 1536
13700023740 227595 1536
13700023740 227596 1536
13700023740 227597 1536
13700023740 227598 1536
13700023740 227599 1536
13700023740 227600 1536
13700023740 227596 1537
13700023740 227597 1537
13700023740 227598 1537
13700023740 227599 1537
13700023740 227600 1537
13700023740 227601 1537
13700023740 227602 1537
13700023740 227603 1537
13700023740 227604 1537
13700023740 227605 1537
13700023740 227606 1537
13700023740 227607 1537")