我需要计算移动窗口的移动平均值和标准差。使用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")
谢谢,
布拉德
答案 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