如何找到每组 r 中连续 n 天的平均值
How to find mean of n consecutive days in each group r
我有一个包含 id(包含重复项)、日期(包含重复项)、值的数据框。这些值是针对不同的连续日期记录的。现在我想要的是用 id 和日期(连续 n 天)对数据框进行分组并找到平均值。 return NA 如果最后一组不包含 n 天。
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
问题中的数据在 id
内排序且连续,因此我们假设是这种情况。此外,当问题涉及重复日期时,我们假设这意味着不同的 id 值可以具有相同的日期,但在 id 中,日期是唯一且连续的。现在,使用 id
末尾注释 2 中可重复显示的数据,并使用 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
注一
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)
我有一个包含 id(包含重复项)、日期(包含重复项)、值的数据框。这些值是针对不同的连续日期记录的。现在我想要的是用 id 和日期(连续 n 天)对数据框进行分组并找到平均值。 return NA 如果最后一组不包含 n 天。
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
问题中的数据在 id
内排序且连续,因此我们假设是这种情况。此外,当问题涉及重复日期时,我们假设这意味着不同的 id 值可以具有相同的日期,但在 id 中,日期是唯一且连续的。现在,使用 id
末尾注释 2 中可重复显示的数据,并使用 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
注一
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)