按组对R数据帧中的值进行计数
我在R按组对R数据帧中的值进行计数,r,dataframe,dplyr,R,Dataframe,Dplyr,我在Rdf中有一个数据帧,如下所示: PROD STORE WEEK 13700023740 227587 1534 13700023740 227588 1534 13700023740 227589 1534 13700023740 227590 1534 13700023740 227591 1534 13700023740 227588
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
表示周。我想使用groupby
PROD
和WEEK
创建一个新的数据框new\u df
,其中包含三列Entry
、Exit
和Total
Entry
应给出特定周内新门店PROD
的数量<代码>退出应给出该周退出的门店数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
我用以下公式计算出了如何获取列总计中的计数:
df %>% group_by(PROD,WEEK) %>% summarise(Total = n_distinct(STORE))
有人能建议如何得到另外两列吗
主要编辑:链接到包含的真实数据集,并将评论整合到问题中(不删除原始帖子中的样本数据,以提供与@Moody_mudscapper讨论的完整视角)
在评论部分的讨论之后,我附上了真实的数据集,因为原始帖子中的样本数据没有捕捉到一些关键方面。它是.rda文件
1) 对于产品
-存储
组合,周
值并不总是连续的
2) 存储
值在特定的周
中丢失后,可能会重新出现产品的值。由于它是一个销售交易数据,如果商店中的周中没有产品的销售,则该商店值不会在相应的周中出现,但可能会在后几周出现。例如,对于PROD
13700023740,STORE
227587在WEEK
1535中丢失,但在WEEK
1545、1550等中可能有227587个。WEEK
的最大可能值为1739。因此,1739年当天或之前数周的STORE
的任何新值都是PROD
的输入计数
3) 要计算退出次数,最后一个周
之后的周
应被视为退出周
。例如,如果< <代码> >代码> <代码>存储> <代码> 227587,对于代码> PROD//COD> 13700023740是1630,那么我们可以考虑1631作为代码<存储> /COD> 227587的退出周。在这里,任何产品
-存储
组合的最大可能周
为1739。如果您的最后一行预期输出出现错误,我认为应该这样做:
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
库(dplyr)
df%>%变异(条目=!重复(存储),
退出=!重复(存储,fromLast=TRUE))%>%
分组依据(产品,周)%>%
汇总(分录=总和(分录),
退出=总和(退出),
总计=n())%>%
变异(出口=c(0,头部(出口,-1)))
##A tibble:4 x 5
##组:产品[1]
#生产周进出口总额
#
# 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")
df你能解释一下如何在第二行得到3和1吗?请看下面的答案,我只是在最后一行中没有得到10(和15)row@Moody_Mudskipper我想你错过了我的样本数据的最后三行,所以你得到了一个不同的结果。否则,您的解决方案将对示例数据起作用。但是,当我在我的真实数据集(相当大)上使用代码时,我认为Exit
列存在一些问题。我正试图弄明白这一点。您的解决方案中的最后一个mutate
命令具体是做什么的?解决方案在包含700K+行的实际数据集中不起作用。只有Total
列返回我想要的值。抱歉,可能我将其简化为创建示例数据。不知道如何共享真实数据。真实数据和样本数据之间有两个关键区别-1)对于产品
-存储
组合,存储
值对于产品
在特定周
缺失后可能会重新出现。例如,对于PROD
13700023740,STORE
227587在WEEK
1535中丢失,但在WEEK
1536等中可能有227587。这可能是您解决方案中的问题吗?对于1)我不清楚哪一周应该有“退出”标志,是真正的下周还是下一个可用的周?我的解决方案应该是后者。对于2)您的意思是产品可以退出和重新进入吗?我的解决方案不支持这一点。首先,尝试在按周对数据进行排序后重新运行它,如果由于某种原因没有排序,它将无法工作