运行平均值/ SD:如何根据条件在平均窗口内选择

时间:2013-09-10 07:36:30

标签: r moving-average

我需要计算移动窗口的移动平均值和标准差。使用catools包就够了!

...但是,我想要做的是定义了我的移动窗口,我想从窗口中的那些值中获取平均值,其中其他变量的对应值满足特定条件。例如,我想计算移动的温度平均值,仅使用窗口内的值(例如+/- 2天),当相对湿度高于80%时。

有人能指点我正确的方向吗?以下是一些示例数据:

da <- data.frame(matrix(c(12,15,12,13,8,20,18,19,20,80,79,91,92,70,94,80,80,90), 
               ncol = 2, byrow = TRUE))

names(da) = c("Temp", "RH") 

谢谢,

布拉德

1 个答案:

答案 0 :(得分:0)

我没有使用catools,但是在该软件包?runmean中(大概)最相关的函数的帮助文本中,您看到x,即输入数据,可以是“数字向量[...]或具有n行的矩阵”。在您的情况下,矩阵替代是最相关的 - 您希望在第二个变量RH上计算焦点变量的平均值Temp,条件,并且该函数需要访问这两个变量。但是,“[i] f x是一个矩阵,而不是每个列将单独处理”。因此,我认为catools无法解决您的问题。相反,我会在rollapply包中建议zoo。在rollapply中,您有参数by.column。默认值为TRUE:“如果为TRUE,则FUN分别应用于每列”。但是,如上所述,我们需要访问函数中的两个列,并将by.column设置为FALSE

# First, specify a function to apply to each window: mean of Temp where RH > 80
meanfun <- function(x) mean(x[(x[ , "RH"] > 80), "Temp"])

# Apply the function to windows of size 3 in your data 'da'.
meanTemp <- rollapply(data = da, width = 3, FUN = meanfun, by.column = FALSE)
meanTemp

# If you want to add the means to 'da', 
# you need to make it the same length as number of rows in 'da'.
# This can be acheived by the `fill` argument,
# where we can pad the resulting vector of running means with NA
meanTemp <- rollapply(data = da, width = 3, FUN = meanfun, by.column = FALSE, fill = NA)

# Add the vector of means to the data frame
da2 <- cbind(da, meanTemp)
da2

# even smaller example to make it easier to see how the function works
da <- data.frame(Temp = 1:9, RH = rep(c(80, 81, 80), each = 3))
meanTemp <- rollapply(data = da, width = 3, FUN = meanfun, by.column = FALSE, fill = NA)
da2 <- cbind(da, meanTemp)
da2

#     Temp RH meanTemp
# 1    1 80       NA
# 2    2 80      NaN
# 3    3 80      4.0
# 4    4 81      4.5
# 5    5 81      5.0
# 6    6 81      5.5
# 7    7 80      6.0
# 8    8 80      NaN
# 9    9 80       NA