R:计算在DataFrame中按行满足多个条件的观察值

问题描述 投票:1回答:2

我有一个包含商店,产品和日期的Summary_Table。我需要创建第4列,计算Records_table中每个Summary_Table符合多个条件的观察数。

这是我的汇总表。

> Summary_Table
Store   Product Date
Chain1  ABC     1/1/2007
Chain1  ABC     1/1/2008
Chain1  ABC     1/1/2009
Chain1  ABC     1/1/2010
Chain1  DEF     1/1/2007
Chain1  DEF     1/1/2008
Chain1  DEF     1/1/2009
Chain1  DEF     1/1/2010
Chain2  ABC     1/1/2007
Chain2  ABC     1/1/2008
Chain2  ABC     1/1/2009
Chain2  ABC     1/1/2010
Chain2  DEF     1/1/2007
Chain2  DEF     1/1/2008
Chain2  DEF     1/1/2009
Chain2  DEF     1/1/2010

这是我的记录表

> Records_Table
Store   Product Eval_Date
Chain1  DEF     2/13/2008
Chain2  ABC     1/15/2009
Chain1  DEF     5/13/2009
Chain2  ABC     3/15/2007
Chain1  DEF     5/14/2010
Chain2  DEF     10/10/2010
Chain1  ABC     11/1/2007
Chain2  ABC     10/1/2008
Chain2  DEF     6/1/2009
Chain2  DEF     7/1/2010
Chain2  ABC     8/1/2009
Chain1  ABC     2/1/2009

所以我需要在Summary表中创建第4列,用于计算Records表中的观察数。这符合汇总表每行的以下标准。

商店应该是平等的,产品应该是平等的,并且对于日期;如果(Records_Table $ Eval_Date)大于(Summary_Table $ Date)。

所以我在Summary_Table中的所需输出是

> Summary_Table
Store   Product Date      Count
Chain1  ABC     1/1/2007    2
Chain1  ABC     1/1/2008    1
Chain1  ABC     1/1/2009    1
Chain1  ABC     1/1/2010    0
Chain1  DEF     1/1/2007    3
Chain1  DEF     1/1/2008    3
Chain1  DEF     1/1/2009    2
Chain1  DEF     1/1/2010    1
Chain2  ABC     1/1/2007    4
Chain2  ABC     1/1/2008    3
Chain2  ABC     1/1/2009    2
Chain2  ABC     1/1/2010    0
Chain2  DEF     1/1/2007    3
Chain2  DEF     1/1/2008    3
Chain2  DEF     1/1/2009    3
Chain2  DEF     1/1/2010    2
r
2个回答
1
投票

你可以使用left join包来做data.table-

library(data.table)
setDT(recdt)[,Eval_Date:=as.Date(Eval_Date,format="%m/%d/%Y")]
setDT(sumdt)[,Date:=as.Date(Date,format="%m/%d/%Y")]
recdt[sumdt,.N, on=c("Store","Product","Eval_Date>Date"), by=.EACHI]

输出 -

    Store  Product Eval_Date  N
 1: Chain1     ABC 2007-01-01 2
 2: Chain1     ABC 2008-01-01 1
 3: Chain1     ABC 2009-01-01 1
 4: Chain1     ABC 2010-01-01 0
 5: Chain1     DEF 2007-01-01 3
 6: Chain1     DEF 2008-01-01 3
 7: Chain1     DEF 2009-01-01 2
 8: Chain1     DEF 2010-01-01 1
 9: Chain2     ABC 2007-01-01 4
10: Chain2     ABC 2008-01-01 3
11: Chain2     ABC 2009-01-01 2
12: Chain2     ABC 2010-01-01 0
13: Chain2     DEF 2007-01-01 3
14: Chain2     DEF 2008-01-01 3
15: Chain2     DEF 2009-01-01 3
16: Chain2     DEF 2010-01-01 2

0
投票

我假设您的汇总表中的日期列是按年分组。如果是这样,使用lubridate和dplyr:

library(dplyr)
library(lubridate)

Records <- Records %>% 
  mutate(Eval_Date = mdy(Eval_Date), Year = year(Eval_Date)) 

summary <- Records %>%
  group_by(Store, Product, Year) %>%
  summarise(Count = n()) %>% 
© www.soinside.com 2019 - 2024. All rights reserved.