【问题标题】:How to calculate rolling mean for last N rows for every row如何计算每行最后 N 行的滚动平均值
【发布时间】:2017-07-13 19:28:45
【问题描述】:

嗨,我有一个 df 和如何计算前 N 行的滚动平均值,在我的情况下是 3

df <- data.frame(X=c(24,NA,NA,45,NA,20,24,10,40,20,20), Y=c(10,NA,14,14,14,10,NA,10,14,14,14))

我试图得到如下的o/p

library(data.table)
library(zoo)
df[, Rolling.Average := rollmeanr(X, 3, fill = NA), by = Y]

o/p:

X   Y  Rolling.Average
24  10  NA
NA  NA  NA
NA  14  NA
45  14  NA
NA  14  45
20  10  NA
24  NA  NA
10  10  20
40  14  NA
20  14  40
20  14  30

错误:k

【问题讨论】:

  • 感谢 AEBilgrau,预期的输出是如果 Y 中的值出现在最后 3 行中,那么 Roll.Ave 中该值的 X 的平均值,即第 3 行中的 14 我们没有相同的值在前 3 行中,对于 row-id 4,它出现在前 3 行中,平均值为 NA,对于 14 的最后一行相同,前 3 行中相同值的平均值为 30
  • (我之前的评论是胡言乱语,所以在这里重述。)您的预期输出到底是什么? Y 等于 NA 应该如何用 by 参数解释?当第一个条目是NA for Y 时,您期望右对齐窗口的平均值是多少
  • 取决于你想使用rollapplyr(X, 3, mean, partial = TRUE)rollapplyr(X, 3, mean, partial = TRUE, na.rm = TRUE)rollapplyr(c(NA, NA, X), 3, mean)rollapplyr(c(NA, NA, X), 3, mean, na.rm = TRUE)
  • 感谢 Grothendieck,rollapplyr(X, 3, mean, partial = TRUE, na.rm = TRUE) 给出答案

标签: r


【解决方案1】:

由于“NA”组的行数少于 3 行,因此引发错误 - data.table 似乎将其解释为一个组。

因此,您的数据应至少包含每个分组的三个条目。然后代码工作(我在下面的示例中添加了一行):

df <- data.frame(X=c(24,NA,NA,45,NA,20,24,10,40,20,20,20),
                 Y=c(10,NA,14,14,14,10,NA,10,14,14,14,NA))

library(data.table)
library(zoo)
df <- as.data.table(df)
df[, Rolling.Average := rollmeanr(X, k = 3, fill = NA), by = Y]
print(df)
#     X  Y Rolling.Average
# 1: 24 10              NA
# 2: NA NA              NA
# 3: NA 14              NA
# 4: 45 14              NA
# 5: NA 14              NA
# 6: 20 10              NA
# 7: 24 NA              NA
# 8: 10 10              18
# 9: 40 14              NA
#10: 20 14              NA
#11: 20 14              NA
#12: 20 NA              NA

或者,您可以通过以下方式排除 by-clause 的 NAs:

df[!is.na(Y), Rolling.Average := rollmeanr(X, k = 3, fill = NA), by = Y]

产生相同的输出。它与您的预期输出不符,但我真的不明白应该如何达到。

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    相关资源
    最近更新 更多