有没有一种方法可以通过在 R 中滚动周期来使用 sqldf Group By return 结果?

Is there a way to use sqldf Group By to return results by rolling periods in R?

我有一组数据,受访者每个月可以回答多次。

structure(list(Month = c("Jan 2016", "Jan 2016", "Feb 2016", 
"Feb 2016", "Mar 2016", "Apr 2016", "May 2016", "Jun 2016", "Jun 2016", 
"Jul 2016", "Aug 2016", "Aug 2016", "Sep 2016", "Sep 2016", "Oct 2016", 
"Nov 2016", "Dec 2016", "Dec 2016", "Jan 2016", "Feb 2016", "Feb 2016", 
"Feb 2016", "Mar 2016", "Mar 2016", "Apr 2016", "May 2016", "May 2016", 
"Jun 2016", "Jun 2016", "Jul 2016", "Aug 2016", "Aug 2016", "Oct 2016", 
"Oct 2016", "Dec 2016", "Mar 2016", "Mar 2016", "Apr 2016", "Apr 2016", 
"May 2016", "Jun 2016", "Aug 2016", "Sep 2016", "Jan 2016", "Jan 2016", 
"Feb 2016", "Feb 2016", "Feb 2016", "Feb 2016", "Feb 2016"), 
    PhysicianID = c(4263, 4263, 4263, 4263, 4263, 4263, 4263, 
    4263, 4263, 4263, 4263, 4263, 4263, 4263, 4263, 4263, 4263, 
    4263, 4278, 4278, 4278, 4278, 4278, 4278, 4278, 4278, 4278, 
    4278, 4278, 4278, 4278, 4278, 4278, 4278, 4278, 4282, 4282, 
    4282, 4282, 4282, 4282, 4282, 4282, 4309, 4309, 4309, 4309, 
    4309, 4309, 4309)), row.names = c(NA, -50L), class = c("tbl_df", 
"tbl", "data.frame"))

我需要知道连续 3 个月的受访者的独特数量。每个月出结果不成问题:

sqldf("SELECT Month,COUNT(distinct(PhysicianID)) FROM Data_for_R GROUP BY Month")
      Month COUNT(distinct(PhysicianID))
1  Apr 2016                            3
2  Aug 2016                            3
3  Dec 2016                            2
4  Feb 2016                            3
5  Jan 2016                            3
6  Jul 2016                            2
7  Jun 2016                            3
8  Mar 2016                            3
9  May 2016                            3
10 Nov 2016                            1
11 Oct 2016                            2
12 Sep 2016                            2

我需要的是 return 看起来更像

结果的方法
1 Jan 2016 to March 2016              xxx
2 Feb 2016 to April 2016              xxx
3 March 2016 to May 2016              xxx
etc...

将 year/month 转换为 yearmon class(当发送到 SQL 时,1 月将显示为 year + 0,2 月将显示为 1/12,等等)然后离开将月份与匹配后 3 个月份的数据结合起来,同时考虑浮点数近似值。按当月分组并执行计数。只保留三个月的行——你可能想要也可能不想要。 name__class 方法将指示的 class 分配给具有后缀 __ 和 class 名称的变量名称。

library(sqldf)
library(zoo)

DFR <- transform(Data_for_R, Month = as.yearmon(Month, "%b %Y"))
Mos <- data.frame(Month = seq(min(DFR$Month), max(DFR$Month), 1/12))

sqldf("select 
    min(b.Month) From__yearmon, 
    max(b.Month) To__yearmon, 
    count(distinct b.PhysicianID) Num
  from 
    Mos a 
    left join DFR b 
      on b.Month between a.Month - 2./12.- 0.001 and a.Month + 0.001
  group by a.Month
  having count(distinct b.Month) = 3
", method = "name__class")

给予

       From       To Num
1  Jan 2016 Mar 2016   4
2  Feb 2016 Apr 2016   4
3  Mar 2016 May 2016   3
4  Apr 2016 Jun 2016   3
5  May 2016 Jul 2016   3
6  Jun 2016 Aug 2016   3
7  Jul 2016 Sep 2016   3
8  Aug 2016 Oct 2016   3
9  Sep 2016 Nov 2016   3
10 Oct 2016 Dec 2016   2

更新

已更新以处理缺少月份的情况。对于问题中的样本数据,它给出了与之前相同的答案,因为没有遗漏月份。