Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.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
按日期关联的缺失记录的rollapplyr_R_Zoo_Rollapply - Fatal编程技术网

按日期关联的缺失记录的rollapplyr

按日期关联的缺失记录的rollapplyr,r,zoo,rollapply,R,Zoo,Rollapply,如何对以下数据应用rollapplyr,使其对日期字段敏感?因为目前我能够将滚动盲法应用于数据集上的日期,例如4个季度,4个季度中至少观察2次 #creating the data set.seed(123) data.frame(id=c(1,1,1,1,1,2,2,2,2,2), date=as.Date(as.character(c(20040930, 20041231, 20050331, 20050630, 20050930, 200409

如何对以下数据应用rollapplyr,使其对日期字段敏感?因为目前我能够将滚动盲法应用于数据集上的日期,例如4个季度,4个季度中至少观察2次

#creating the data
   set.seed(123)
    data.frame(id=c(1,1,1,1,1,2,2,2,2,2), 
               date=as.Date(as.character(c(20040930, 20041231, 20050331, 20050630, 20050930, 20040930, 20050331, 20050630, 20051231, 20060331)), format = "%Y%m%d"),
               col_a=round(runif(10, 0, 100),0),
               col_b=round(runif(10, 0, 100),0))

   id       date col_a col_b
1   1 2004-09-30     3    10
2   1 2004-12-31     8     5
3   1 2005-03-31     4     7
4   1 2005-06-30     9     6
5   1 2005-09-30     9     1
6   2 2004-09-30     0     9
      <missing>
7   2 2005-03-31     5     2
8   2 2005-06-30     9     0
      <missing>
9   2 2005-12-31     6     3
10  2 2006-03-31     5    10
这就是我在应用上述函数后得到的结果

      id date       col_a col_b score
   <dbl> <date>     <dbl> <dbl> <dbl>
 1     1 2004-09-30     3    10 NA   
 2     1 2004-12-31     8     5  1.73
 3     1 2005-03-31     4     7  1.5 
 4     1 2005-06-30     9     6  2.14
 5     1 2005-09-30     9     1  2.11
 6     2 2004-09-30     0     9 NA   
 7     2 2005-03-31     5     2  1.27
 8     2 2005-06-30     9     0  2.45
 9     2 2005-12-31     6     3  2.57
10     2 2006-03-31     5    10  4   
然而,我所期望的是,它会自动考虑到丢失的宿舍本身。这是我的预期输出

       id date       col_a col_b score
   <dbl> <date>     <dbl> <dbl> <dbl>
 1     1 2004-09-30     3    10 NA   
 2     1 2004-12-31     8     5  1.73
 3     1 2005-03-31     4     7  1.5 
 4     1 2005-06-30     9     6  2.14
 5     1 2005-09-30     9     1  2.11
 6     2 2004-09-30     0     9 NA   
                <missing>
 7     2 2005-03-31     5     2  1.27
 8     2 2005-06-30     9     0  2.45
                <missing>
 9     2 2005-12-31     6     3  **5.4**
10     2 2006-03-31     5    10  **3.46**  
请注意,输出中不会显示,我只是出于视觉目的而放置。例如,第10行将只使用第8、9和10行的记录,因为丢失的行也被计算为一行。我如何做到这一点


请注意,例如,对于第10行,n=3应用于平均值,而不是n=4,因为它不应包括缺少的行。

一个选项是为分组前的所有“id”创建完整的“日期”行

数据
你使用的是同一套种子吗?因为我无法复制你的种子data@akrun正确的ya我运行了set.seed123可以复制数据我有疑问,为什么第8行没有使用n=3。在第6行之后,有一个@akrun I put**,因为它是对先前输出的更改。它也使用n=3,但除此之外没有记录,因此只需要3轮。而第10轮和第9轮平均超过4条记录,应该改为3条,因为有一条记录缺失谢谢,但我意识到。。。它总结了包括缺少的行。。。i、 e.如果我想做mean或sd,它不起作用。。。对于第10行,它应该是n=3而不是n=4@yeeen它是基于您所了解的示例和功能。。。事实上,我意识到了这一点,并想修改qn,但在我修改qn之前,你已经回复了。。。非常抱歉。您是否有修订qn的解决方案?@yeeen您可能需要更新平均值的预期输出
       id date       col_a col_b score
   <dbl> <date>     <dbl> <dbl> <dbl>
 1     1 2004-09-30     3    10 NA   
 2     1 2004-12-31     8     5  1.73
 3     1 2005-03-31     4     7  1.5 
 4     1 2005-06-30     9     6  2.14
 5     1 2005-09-30     9     1  2.11
 6     2 2004-09-30     0     9 NA   
                <missing>
 7     2 2005-03-31     5     2  1.27
 8     2 2005-06-30     9     0  2.45
                <missing>
 9     2 2005-12-31     6     3  **5.4**
10     2 2006-03-31     5    10  **3.46**  
library(tidyverse)
library(zoo)
complete(data, id, date, fill = list(col_a = 0, col_b = 0)) %>% 
      group_by(id) %>% 
      mutate(score = (col_a + col_b) / 
         rollapplyr(col_b, 4, sum, fill=NA, by.column=TRUE, partial=2)) %>% 
      ungroup %>% 
      select(id, date, col_a, col_b, score) %>%
      right_join(data)
# A tibble: 10 x 5
#      id date       col_a col_b  score
#   <dbl> <date>     <dbl> <dbl>  <dbl>
# 1     1 2004-09-30     3    10 NA    
# 2     1 2004-12-31     8     5  0.867
# 3     1 2005-03-31     4     7  0.5  
# 4     1 2005-06-30     9     6  0.536
# 5     1 2005-09-30     9     1  0.526
# 6     2 2004-09-30     0     9 NA    
# 7     2 2005-03-31     5     2  0.636
# 8     2 2005-06-30     9     0  0.818
# 9     2 2005-12-31     6     3  1.8  
#10     2 2006-03-31     5    10  1.15 
data <- structure(list(id = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2),
  date = structure(c(12691, 
 12783, 12873, 12964, 13056, 12691, 12873, 12964, 13148, 13238
 ), class = "Date"), col_a = c(3, 8, 4, 9, 9, 0, 5, 9, 6, 5), 
col_b = c(10, 5, 7, 6, 1, 9, 2, 0, 3, 10)), row.names = c(NA, 
 -10L), class = "data.frame")