r - r 中的分组移动平均线

标签 r grouping moving-average

我正在尝试计算 r 中特定字段的移动平均值,但我需要将此移动平均值按两个或多个其他字段分组。这个新平均值的目的是用于预测分析,所以我也需要它是尾随的。 任何没有足够值进行平均的变量(例如学生 J)最好给出 NA 或其原始 Score 值。

我一直在尝试 rollapply 和 data.table,但没有成功!

我提供了数据表和两个移动平均线(k=2 的 AVG2 和 k=3 的 AVG3)以准确显示我所追求的结果。移动平均值在分数上,要分组的变量是学校、学生和地区。请帮忙!

   no   school  Student area    Score **AVG2**  **AVG3**
   1    I       S       A       5      NA       NA
   2    B       S       A       2      NA       NA
   3    B       S       A       7      NA       NA
   4    B       O       A       3      NA       NA
   5    B       O       B       9      NA       NA
   6    I       O       A       6      NA       NA
   7    I       O       B       3      NA       NA
   8    I       S       A       7      NA       NA
   9    I       O       A       1      NA       NA
   10   B       S       A       7      4.5      NA
   11   I       S       A       3      NA       NA
   12   I       O       A       8      3.5      NA
   13   B       S       A       3      7        5.33
   14   I       O       A       4      4.5      5
   15   B       O       A       1      NA       NA
   16   I       S       A       9      5        5
   17   B       S       A       4      5        5.67
   18   B       O       A       6      2        NA
   19   I       S       A       3      6        6.33
   20   I       O       B       8      NA       NA
   21   B       S       A       3      3.5      4.67
   22   I       O       A       4      6        4.33
   23   B       O       A       1      3.5      3.33
   24   I       S       A       9      6        5
   25   B       S       A       4      3.5      3.33
   26   B       O       A       6      3.5      2.67
   27   I       J       A       6      NA       NA

这是在 r 中重新创建初始表的代码:

school <- c('I','B','B','B','B','I','I','I','I','B','I','I','B','I','B','I','B','B','I','I','B','I','B','I','B','B','I')
Student <- c('S','S','S','O','O','O','O','S','O','S','S','O','S','O','O','S','S','O','S','O','S','O','O','S','S','O','J')
area <- c('A','A','A','A','B','A','B','A','A','A','A','A','A','A','A','A','A','A','A','B','A','A','A','A','A','A','A')
Score <- c(5,2,7,3,9,6,3,7,1,7,3,8,3,4,1,9,4,6,3,8,3,4,1,9,4,6,6)
data.frame(school, Student, area,  Score)

最佳答案

您可以尝试使用 dplyrTTR 解决问题,但是对于学校的学生 J I 来说,不可能计算移动平均值,因为只有一个测量值。

使用 stats:filter 计算的 AVG2 给出了您想要的结果,但我还添加了使用 TTR::SMA 计算的 AVG2b 以显示简单的移动平均计算,其中还考虑了当前测量值。

library(dplyr)
library(TTR)

df <- data.frame(school, Student, Score)
df$AVG2 <- NA
df$AVG2b <- NA
df[!(df$school=="I" & df$Student=="J"),] <- df[!(df$school=="I" & df$Student=="J"),] %>% 
  group_by(school, Student) %>% 
  mutate(AVG2 = stats::filter(Score, c(0, 0.5, 0.5), sides = 1 ), AVG2b = SMA(Score, n= 2)) 

    > df
   school Student Score AVG2 AVG2b
1       I       S     5   NA    NA
2       B       S     2   NA    NA
3       B       S     7   NA   4.5
4       B       O     3   NA    NA
5       B       O     9   NA   6.0
6       I       O     6   NA    NA
7       I       O     3   NA   4.5
8       I       S     7   NA   6.0
9       I       O     1  4.5   2.0
10      B       S     7  4.5   7.0
...

关于r - r 中的分组移动平均线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35249019/

相关文章:

r - 将计数作为标签添加到 geom_count 中的点

r - 如何提高这种线性插值的性能

r - 使用 R 中的查找表对字符串中的字符求和

sql - 按表中的分组记录运行总计

algorithm - "Time Aware"指数移动平均线

algorithm - 获取数据流的平均值、p95 和 p99

r - sapply() 返回列表而不是向量

wpf - 当 DataGrid 元素分组时,会触发 ComboBox 的 SelectionChanged

javascript - 使用 d3.js 对多个字段进行分组

pandas - DataFrame:使用滚动、均值和移位的移动平均值,同时忽略 NaN