按日期关联的缺失记录的rollapplyr
如何对以下数据应用rollapplyr,使其对日期字段敏感?因为目前我能够将滚动盲法应用于数据集上的日期,例如4个季度,4个季度中至少观察2次按日期关联的缺失记录的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
#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")