【问题标题】:How to find mean of n consecutive days in each group r如何找到每组 r 中连续 n 天的平均值
【发布时间】:2018-10-21 11:10:04
【问题描述】:

我有一个数据框,其中包含 id(包含重复)、日期(包含重复)、值。这些值被记录为不同的连续天数。现在我想要的是用 id 和日期(连续 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         

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 尝试使用 group_by(id,group_end_date=cut("date","n days")) 并使用循环删除 NA

标签: r group-by dplyr plyr lubridate


【解决方案1】:

问题中的数据在id 内是有序且连续的,因此我们假设是这种情况。此外,当问题涉及重复日期时,我们假设这意味着不同的 id 值可以具有相同的日期,但在 id 内,日期是唯一且连续的。现在,使用id 末尾组注释 2 中可重复显示的数据,并使用gl 计算组号。然后按idgroup_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)

【讨论】:

    猜你喜欢
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多