使用dplyr在特定日期内观察值的平均值

时间:2018-10-20 01:22:07

标签: r dplyr

我有一个看起来像这样的数据集:

data <- data.frame( date = rep(c(1:10),5), obs = c(1:50) )

在其中一列中有日期,在另一列中有变量obs。我想使用dplyr为每一行计算变量obs的平均值,以在date的值的2天内进行观察,但不包括{{1 }}。

例如对于date行中的date = 3,我想取13等于1、2、3、4和5的所有行并取该值的平均值这些行的date,不包括行obsobs的值。这将产生:

13

您可以在其中看到我对mean(c(1:5, 11, 12, 14, 15, 21:25, 31:35, 41:45)) # 23.41667 1之间的日期进行了所有观察,但是我省略了对行5的观察。

理想情况下,我想在任何日期进行操作:我的数据集没有连续的日期,或者同一天可能有多个观测值。因此,如果数据集看起来像:

13

在日期data <- data.frame( date = c(rep(c(1:10),5), 3), obs = c(1:51) ) 重复两次的情况下,我希望在行3中获得以下平均值:

13

,第mean(c(1:5, 11, 12, 14, 15, 51, 21:25, 31:35, 41:45)) # 24.52 行中的含义如下:

51

基本上,对于每一行,我希望获得mean(c(1:5, 11:15, 21:25, 31:35, 41:45)) # 23 列中所有other个观测值的平均值,该观测值发生在该特定行中日期的2天(+/- 2天)内。 / p>

2 个答案:

答案 0 :(得分:1)

如果要获取4个值的平均值,即上面2个值,下面2个(不包括该值),请使用循环

sapply(seq_len(nrow(data)), function(i)
     mean(data$obs[pmax(0, setdiff((i-2):(i+2), i))], na.rm = TRUE))

或将rollapplypartial = TRUE一起使用

library(zoo)
library(dplyr)
data %>% 
    mutate(avg = (rollapply(obs, width = 5, FUN = "sum", align = "center", 
        fill = NA, partial = TRUE) - obs)/rep(c(2:4, 3:2), c(1, 1, n()-4, 1, 1))) 

答案 1 :(得分:0)

使用dplyr

解决方案1正在从实际日期的下方两行和上方两行计算平均值:

data %>%
  mutate(temp1 = lag(obs, 1), 
         temp2 = lag(obs, 2),
         temp3 = lead(obs, 1),
         temp4 = lead(obs, 2)) %>%
  mutate(mean = rowMeans(cbind(temp1,temp2, temp3, temp4), na.rm = TRUE)) %>%
  select(date, obs, mean)

解决方案2正在从实际日期的下方两行和上方两行计算平均值,但要考虑所有出现的日期:

data %>%
  mutate(temp1 = lag(obs, 1), 
         temp2 = lag(obs, 2),
         temp3 = lead(obs, 1),
         temp4 = lead(obs, 2)) %>%
  group_by(date) %>%
  mutate(n = n(),
         mean = sum(temp1, temp2, temp3, temp4, na.rm = TRUE)/(4*n)) %>%
  ungroup() %>%
  select(date, obs, mean)