【发布时间】:2018-10-06 17:57:21
【问题描述】:
如何对以下数据应用 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=2 的 2005-09-30 记录。
library(zoo)
data %>%
group_by(id) %>%
mutate(score = (col_a + col_b) / rollapplyr(col_b, 4, mean, fill=NA, by.column=TRUE, partial=2)) %>%
ungroup %>% select(id, date, col_a, col_b, score)
这就是我应用上述功能后得到的结果
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 行,应使用 n=3 进行平均,而不是 n=4,因为它不应包含缺失的行。
【问题讨论】:
-
您是否使用相同的
set.seed,因为我无法复制您的数据 -
@akrun 正确,我运行 set.seed(123) 可以重现数据
-
我有一个疑问,为什么第8行没有使用n = 3。在第6行之后,有一个
<missing> -
@akrun 我放了“**”,因为它是对先前输出的更改。它也使用 n=3,但它没有除此之外的记录,因此只需要 3 轮。而第 10 轮和第 9 轮平均超过 4 条记录,应该改为 3 条,因为缺少一条记录