我有一个看起来像这样的数据集:
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
,不包括行obs
中obs
的值。这将产生:
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>
答案 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))
或将rollapply
与partial = 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)