在不同大小的窗口上滚动求和并改变组R

在不同大小的窗口上滚动求和并改变组R,r,sum,data.table,dplyr,R,Sum,Data.table,Dplyr,我在这个网站上读到了关于滚动求和的所有问答,但我无法理解大多数复杂的代码,所以我的调整技能有限。 我尝试实现了一些建议的解决方案,包括,等等,但要么出现错误,要么计算机崩溃,即使我只使用了1000行和3列。因此,很明显,我弄乱了代码 我的数据如下所示(通过dput的前50行)。数据集总计约为100000行 structure(list(pnum = c("4778744", "4778744", "4778744", "4832724", "4840655", "4854

我在这个网站上读到了关于滚动求和的所有问答,但我无法理解大多数复杂的代码,所以我的调整技能有限。 我尝试实现了一些建议的解决方案,包括,等等,但要么出现错误,要么计算机崩溃,即使我只使用了1000行和3列。因此,很明显,我弄乱了代码

我的数据如下所示(通过dput的前50行)。数据集总计约为100000行

           structure(list(pnum = c("4778744", "4778744", "4778744", "4832724", 
"4840655", "4854957", "4952026", "4832724", "4832724", "4840655", 
"4952026", "4854957", "4952026", "4979975", "5062877", "5062877", 
"4979975", "4979975", "4979975", "5093287", "5148510", "5093287", 
"5148510", "5093287", "5148510", "5093287", "5148510", "5093287", 
"5148510", "5093287", "5148510", "5093287", "5148510", "5212120", 
"5375012", "5168079", "5375012", "5212120", "5212120", "5168079", 
"4811345", "4851990", "4947366", "5142672", "5317715", "4878166", 
"4851990", "5142672", "5317715", "4878166", "5142672", "5317715", 
"4878166", "5142672", "5317715", "4878166", "5142672", "5317715", 
"4878166", "5185878", "4926323", "4926323", "4926323", "4926323", 
"5185878", "4926323", "4926323", "4926323", "4926323", "4926323", 
"4926323", "5129067", "5136697", "5210841", "5237700", "5237700", 
"5237700", "5247644", "5805912", "5828869", "5357626", "5247644", 
"5805912", "5828869", "5357626"), ID = c("03859643-1", "04488864-4", 
"04560399-1", "03859643-1", "03859643-1", "03859643-1", "03859643-1", 
"03901719-2", "04086089-2", "04086089-2", "04407934-2", "04488864-4", 
"04952026-3", "03859643-1", "03859643-1", "03901719-2", "03912481-3", 
"03940277-1", "04979975-2", "03859643-1", "03859643-1", "03864113-1", 
"03864113-1", "04877300-1", "04877300-1", "04877300-3", "04877300-3", 
"05040862-3", "05040862-3", "05093287-4", "05093287-4", "05093287-6", 
"05093287-6", "03859643-1", "03859643-1", "03859643-1", "03870399-2", 
"03901719-2", "03923529-1", "04784976-1", "03860454-2", "03860454-2", 
"03860454-2", "03860454-2", "03860454-2", "03860454-2", "04761567-2", 
"04870622-2", "04870622-2", "04870622-2", "04878166-2", "04878166-2", 
"04878166-2", "04878166-3", "04878166-3", "04878166-3", "04878166-5", 
"04878166-5", "04878166-5", "03860454-2", "03860454-2", "04610004-1", 
"04734852-2", "04734852-3", "04761567-2", "04761567-2", "04777587-1", 
"04835414-1", "04878166-2", "04926323-10", "04926323-5", "03860454-2", 
"03860454-2", "03860454-2", "03860454-2", "05237700-2", "05237700-3", 
"03860454-2", "03860454-2", "03860454-2", "03860454-2", "04731737-1", 
"04731737-1", "04731737-1", "04731737-1"), Time = c(1986L, 1986L, 
1986L, 1988L, 1988L, 1988L, 1988L, 1988L, 1988L, 1988L, 1988L, 
1988L, 1988L, 1989L, 1989L, 1989L, 1989L, 1989L, 1989L, 1990L, 
1990L, 1990L, 1990L, 1990L, 1990L, 1990L, 1990L, 1990L, 1990L, 
1990L, 1990L, 1990L, 1990L, 1991L, 1991L, 1991L, 1991L, 1991L, 
1991L, 1991L, 1986L, 1987L, 1987L, 1987L, 1987L, 1987L, 1987L, 
1987L, 1987L, 1987L, 1987L, 1987L, 1987L, 1987L, 1987L, 1987L, 
1987L, 1987L, 1987L, 1988L, 1988L, 1988L, 1988L, 1988L, 1988L, 
1988L, 1988L, 1988L, 1988L, 1988L, 1988L, 1989L, 1989L, 1990L, 
1990L, 1990L, 1990L, 1991L, 1991L, 1991L, 1991L, 1991L, 1991L, 
1991L, 1991L)), .Names = c("pnum", "inventor", "pryear"), row.names = c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 
16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 
29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 325L, 
326L, 327L, 328L, 329L, 330L, 331L, 332L, 333L, 334L, 335L, 336L, 
337L, 338L, 339L, 340L, 341L, 342L, 343L, 344L, 345L, 346L, 347L, 
348L, 349L, 350L, 351L, 352L, 353L, 354L, 355L, 356L, 357L, 358L, 
359L, 360L, 361L, 362L, 363L, 364L, 365L, 366L, 367L, 368L, 369L
), class = "data.frame")
多个
发明人
在一个名为
pryear
的特定年份内,就一个项目
pnum
进行合作。我在寻找三件事:

在@Thierry发表评论后,我更改了数据样本,以确保他指出的问题得到解决

  • 在当前
    pryear
    之前的x(比如3)年内,每个发明人进行的项目数量,因此,如果当前项目的年份是1977年,我希望包括1974年至1976年进行的项目数量。如果之前没有出现,理想情况下结果为“0”。@Alex提供的答案可以用来实现第一个目标。但正如评论中所讨论的,它的效率并不高(特别是因为我的时间范围是从1952年到2010年,有50000多名发明家)
  • 在同一时间窗口中与每个发明人一起工作的不同发明人的总数
  • 如果一个项目有多个发明人,我将查找每个发明人在过去的同一时间窗口内与正在处理当前项目的其他发明人协作的次数

  • 这是第一个问题的解决方案。作为练习,你可以解决其他问题

    第一种解决方案仅使用
    dplyr
    。您可能会在使用大型数据集时遇到问题

    library(dplyr)
    df %>% 
      inner_join(
        df %>% 
          select(inventor, oldyear = pryear), 
        by = "inventor") %>% 
      filter(pryear - 3 <= oldyear, oldyear < pryear) %>% 
      group_by(inventor, pryear) %>% 
      summarise(projects = n())
    

    这是第一个问题的解决方案。作为练习,你可以解决其他问题

    第一种解决方案仅使用
    dplyr
    。您可能会在使用大型数据集时遇到问题

    library(dplyr)
    df %>% 
      inner_join(
        df %>% 
          select(inventor, oldyear = pryear), 
        by = "inventor") %>% 
      filter(pryear - 3 <= oldyear, oldyear < pryear) %>% 
      group_by(inventor, pryear) %>% 
      summarise(projects = n())
    

    请提供一组更好的样本数据。此集合不包含与您的第一个目标匹配的数据。@Thierry,谢谢您的回复。这个例子包含了我认为所有的信息。可以添加为第四列的是一个虚拟变量,每行为1。每项发明(第一列中的数字)都是由发明人(第二列中的字符串)在特定年份(第三列中的数字)执行的一个项目。在复制粘贴数据时,我确实注意到了一个问题,所以我更改了上载,将完整日期也包括在内。希望澄清?不,它不包含所有信息。没有一个发明者拥有多年的项目<代码>行和(带(df,table(inventors,pryear))>0)@Thierry,感谢您的澄清。我完全忽略了这一点。这与数据样本中的这一部分有特殊性。只是上传一个新的。我现在的样本基于两位多产的
    发明家的组合。请提供一组更好的样本数据。此集合不包含与您的第一个目标匹配的数据。@Thierry,谢谢您的回复。这个例子包含了我认为所有的信息。可以添加为第四列的是一个虚拟变量,每行为1。每项发明(第一列中的数字)都是由发明人(第二列中的字符串)在特定年份(第三列中的数字)执行的一个项目。在复制粘贴数据时,我确实注意到了一个问题,所以我更改了上载,将完整日期也包括在内。希望澄清?不,它不包含所有信息。没有一个发明者拥有多年的项目<代码>行和(带(df,table(inventors,pryear))>0)
    @Thierry,感谢您的澄清。我完全忽略了这一点。这与数据样本中的这一部分有特殊性。只是上传一个新的。我现在以两位多产的
    发明家的组合为基础制作了这个样本。我认为要真正回答我的第一个问题,有必要做一点小小的调整。它应该是
    filter(pryear-3%
    ,所以
    一个小的调整对于真正回答我的第一个问题是必要的。它应该是
    过滤器(pryear-3%
    ,所以