在R数据帧中按组计算值

时间:2018-07-30 21:51:20

标签: r dataframe dplyr

我在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_byPROD和三列WEEKEntry和{{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。由于它是销售交易数据,因此如果WEEKPROD中的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。

1 个答案:

答案 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")