Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按组对R数据帧中的值进行计数_R_Dataframe_Dplyr - Fatal编程技术网

按组对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

我在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
表示周。我想使用
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)您的意思是产品可以退出和重新进入吗?我的解决方案不支持这一点。首先,尝试在按周对数据进行排序后重新运行它,如果由于某种原因没有排序,它将无法工作