我有一个数据文件,其中包含id(包含重复)、日期(包含重复)、值。这些数值连续记录不同的日子。现在,我想要的是用id和date(作为连续的n天)对数据进行分组,并找到值的平均值。如果最后一组不包含n天,则返回NA。
id date value
1 2016-10-5 2
1 2016-10-6 3
1 2016-10-7 1
1 2016-10-8 2
1 2016-10-9 5
2 2013-10-6 2
. . .
. . .
. . .
20 2012-2-6 10期望输出,连续n天为3。
id date value group_n_consecutive_days mean_n_consecutive_days
1 2016-10-5 2 1 2
1 2016-10-6 3 1 2
1 2016-10-7 1 1 2
1 2016-10-8 2 2 NA
1 2016-10-9 5 2 NA
2 2013-10-6 2 1 4
.
.
.
.
20 2012-2-6 10 6 25 发布于 2018-10-21 13:46:36
问题中的数据是在id中排序和连续的,所以我们假设情况是这样的。同样,当问题涉及重复日期时,我们假设这意味着不同的id值可以有相同的日期,但在id中,日期是唯一的和连续的。现在,使用注释2中所示的数据,由id在最终组中重复使用,并使用gl计算组号。然后用id和group_no对较小的组进行分组,取3组或NA组的平均值。
library(dplyr)
DF %>%
group_by(id) %>%
mutate(group_no = c(gl(n(), 3, n()))) %>%
group_by(group_no, add = TRUE) %>%
mutate(mean = if (n() == 3) mean(value) else NA) %>%
ungroup给予:
# A tibble: 6 x 5
id date value group_no mean
<int> <date> <int> <int> <dbl>
1 1 2016-10-05 2 1 2
2 1 2016-10-06 3 1 2
3 1 2016-10-07 1 1 2
4 1 2016-10-08 2 2 NA
5 1 2016-10-09 5 2 NA
6 2 2013-10-06 2 1 NA注1
gl(...)的替代方案可以是cumsum(rep(1:3, length = n()) == 1),if (n() = 3) mean(value) else NA的替代方案可以是mean(head(c(value, NA, NA), 3))。
注2
以可复制形式输入的数据被假定为:
Lines <- "id date value
1 2016-10-5 2
1 2016-10-6 3
1 2016-10-7 1
1 2016-10-8 2
1 2016-10-9 5
2 2013-10-6 2"
DF <- read.table(text = Lines, header = TRUE)
DF$date <- as.Date(DF$date)https://stackoverflow.com/questions/52914669
复制相似问题