计算R中各列的移动平均值

时间:2020-10-20 17:17:37

标签: r mean

我有一个时间序列数据,每3年我想要一个移动平均值。我已经看到了TTRSMA查询,但是它们都表明滚动平均值或移动平均值运算是在单个列行上执行的,并且基于该行意味着将创建一个新列,其编号为取决于NA的值,k的顶部。

我希望将数据帧生成为具有移动平均值的原始数据。由于我的窗口将是3,这意味着将使用中心列和2个相邻列。我们可以转储第一列和最后一列,以防万一它们没有相邻的列。

假设数据如下:

   1961 1962 1963 1964 1965 1966 1967
1    9   13    8    4   15    1   19
2   14    2   10    6   15    7   17
3   16    7    1   18    3    9    6

在这里进行详细说明是我的主意。

1962 <- c(9+13+8/3, 14+2+10/3, 16+7+1/3) 以此类推连续的列。第一列和最后一列可以包含NAs

3 个答案:

答案 0 :(得分:1)

这种类型的问题通常与重塑数据有关。为了计算滚动手段,格式应为长格式,数据应为宽格式。请参阅this post,以了解如何将数据从宽格式重整为长格式。
然后使用功能rollmean,包装zoo计算均值。
最后将其重塑为宽幅格式。

library(dplyr)
library(tidyr)

jj1 %>%
  mutate(id = row_number()) %>%
  pivot_longer(
    cols = -id,
    names_to = 'year',
    values_to = 'value'
  ) %>%
  arrange(id, year) %>%
  group_by(id) %>%
  mutate(value = zoo::rollmean(value, k = 3, fill = NA)) %>%
  pivot_wider(
    id_cols = id,
    names_from = year,
    values_from = value
  ) %>%
  ungroup() %>%
  select(-id)

答案 1 :(得分:1)

您可以通过简单地在R中使用循环来实现:

#generating some dummy data
datad <- matrix(rnorm(100), ncol = 10)
colnames(datad) <- 2001:2010

ma <- list() #moving average
for(i in 2:(ncol(datad)-1)) {
  ma[[i-1]] <- apply(datad[, (i-1):(i+1)], 1, mean)
}

#convert back to matrix
ma <- Reduce(cbind, ma)
#getting original column name
colnames(ma) <- colnames(datad)[2:(ncol(datad)-1)]

答案 2 :(得分:0)

假设问题旨在c((9+13+8)/3, (14+2+10)/3, (16+7+1)/3) rollmean作为1962的值而不是此处显示的值,可以以下两种方式之一使用。这些单线将矩阵作为结果,但是如果将as.data.frame作为数据帧很重要,则可以在结果上使用library(zoo) t(apply(DF, 1, rollmean, 3)) ## 1962 1963 1964 1965 1966 ## 1 10.0000 8.3333 9.0000 6.6667 11.667 ## 2 8.6667 6.0000 10.3333 9.3333 13.000 ## 3 8.0000 8.6667 7.3333 10.0000 6.000 t(rollmean(t(DF), 3)) ## [,1] [,2] [,3] [,4] [,5] ## 1 10.0000 8.3333 9.0000 6.6667 11.667 ## 2 8.6667 6.0000 10.3333 9.3333 13.000 ## 3 8.0000 8.6667 7.3333 10.0000 6.000

Lines <- "
   1961 1962 1963 1964 1965 1966 1967
1    9   13    8    4   15    1   19
2   14    2   10    6   15    7   17
3   16    7    1   18    3    9    6"
DF <- read.table(text = Lines, check.names = FALSE)

注意

可复制形式的输入:

$ awk -F '\t' '{for (i=6; i<=24; i+=2) if ($i != $4) next} 1' file
NC_044998.1     4016    0       TT      0       TT      0       TT      0       TT      0       TT      0       TT      0       TT      0       TT      0       TT     0          TT       0       TT
NC_044998.1     4016    0       TT      0       TT      0       TT      0       TT      0       TT      0       TT      0       TT      0       TT      0       TT     0          TT       0       TT
NC_044998.1     4017    2       CC      2       CC      2       CC      2       CC      2       CC      2       CC      2       CC      2       CC      2       CC     2          CC       2       CC