如何计算每列的滚动平均值

时间:2020-10-07 22:57:05

标签: r dplyr

我想按组计算每列每五行的平均值,然后尝试:

name<-colnames(df[,4:10])

df1<-for (i in name){
    df%>%
      group_by(A)%>%
      summarise(!!paste(i,"mean"):=rollapplyr(get(i),5,mean,fill = NA,by.column=T))
}

结果df1为NULL

然后我尝试:

for (i in name){
    df%>%
      group_by(A)%>%
      mutate(!!paste(i,"mean"):=rollapplyr(get(i),5,mean,fill = NA,by.column=T))
}

这可以运行,但是什么也没有发生,df保持不变。如果我将上述代码分配给df1,则df1仍为NULL。

我也尝试过rollmean

df1<- for (i in name){
+     df%>%
+       group_by(CONM)%>%
+       mutate(!!paste(i,"mean"):=rollmean(get(i),5,fill = NA,align = "right"))
+ }

但是仍然会为NULL。

我的数据是这样的:

CONM    A  B   C
a       1  2   3
a       2  3   4
a       3  4   5
a       4  5   6
a       5  6   7
a       6  7   8

我想获得每个CONM的结果:

CONM    A  B   C   A_mean  B_mean  C_mean
a       1  2   3    NA       NA      NA
a       2  3   4    NA       NA      NA
a       3  4   5    NA       NA      NA
a       4  5   6    NA       NA      NA
a       5  6   7    3        4       5
a       6  7   8    4        5       6
b       1  2   3    NA       NA      NA

有人可以帮我吗?我应该使用其他包装吗?谢谢

1 个答案:

答案 0 :(得分:2)

我们可以将mutateacross一起使用

library(dplyr)
library(zoo)
df %>%
   group_by(CONM) %>%
   mutate(across(A:C, ~ rollmean(., 5, fill = NA, align = 'right'), 
             .names = '{col}_mean')) %>%
   ungroup

-输出

# A tibble: 7 x 7
#  CONM      A     B     C A_mean B_mean C_mean
#  <chr> <int> <int> <int>  <dbl>  <dbl>  <dbl>
#1 a         1     2     3     NA     NA     NA
#2 a         2     3     4     NA     NA     NA
#3 a         3     4     5     NA     NA     NA
#4 a         4     5     6     NA     NA     NA
#5 a         5     6     7      3      4      5
#6 a         6     7     8      4      5      6
#7 b         1     2     3     NA     NA     NA

或为@G。格洛腾迪克提到,rollmeanr可以正确对齐

df %>%
    group_by(CONM) %>%
    mutate(across(A:C, ~ rollmeanr(., 5, fill = NA), .names = '{col}_mean'))

数据

df <- structure(list(CONM = c("a", "a", "a", "a", "a", "a", "b"), A = c(1L, 
2L, 3L, 4L, 5L, 6L, 1L), B = c(2L, 3L, 4L, 5L, 6L, 7L, 2L), C = c(3L, 
4L, 5L, 6L, 7L, 8L, 3L)), class = "data.frame", row.names = c(NA, 
-7L))
相关问题