【问题标题】:How to calculate the average of the value of the previous row + the value of the current row + the value of the subsequent row in R?如何计算R中上一行的值+当前行的值+后一行的值的平均值?
【发布时间】:2021-11-23 13:21:36
【问题描述】:

我正在尝试从 R 中相对简单的平均值中获取值,但我无法找到最佳解决方案。

为了更清楚,我打算创建一个名为 TMA 的附加列,其中包含 mutate 并在其中获取每行的这些平均值,如下面的 Excel 图像所示:

Excel easy way example

【问题讨论】:

  • 对不起,我的 Excel 中葡萄牙语的 =MÉDIA() 与 =MEAN() 或 =AVG() 相同 ...
  • 如果您创建一个小的可重现示例以及预期的输出,这将更容易提供帮助。阅读how to give a reproducible example。图片不是共享数据/代码的正确方式。

标签: r excel function dplyr


【解决方案1】:

R 中的各种包中有各种“滚动窗口”功能。 以下内容基于{slider}。如果语法不是您的风格,请查看{zoo} 及其rollmean() 函数。

可重现的数据集/样本
如果您提供可重现的数据集,您会在这里找到很多朋友。 我选择了您图片中显示的部分数据。考虑将来这样做。

我将您的月-年转换为年-月(数字)的字符。在 R 中,我建议您为此使用正确的 Date 或 datetime 对象。这可以帮助进行其他转换。 ((但那是另一个讨论))

library(dplyr)

df <- tibble(
    Data = c("2021-03", "2021-04","2021-05","2021-06","2021-07","2021-08")
    ,ANOM = c(-0.79,-0.72,-0.46,-0.28,-0.38,-0.45)
)

使用 {slider}
要了解什么滑块打印出以下内容:

library(slider)

> df %>% slide(~.x, .before = 2)
[[1]]
# A tibble: 1 x 2
  Data     ANOM
  <chr>   <dbl>
1 2021-03 -0.79
1 2021-03 -0.79

[[2]]
# A tibble: 2 x 2
  Data     ANOM
  <chr>   <dbl>
1 2021-03 -0.79
2 2021-04 -0.72

[[3]]
# A tibble: 3 x 2
  Data     ANOM
  <chr>   <dbl>
1 2021-03 -0.79
2 2021-04 -0.72
3 2021-05 -0.46

这会构建一个大小为 3 的“滑动窗口”,即实际值和前一个 2。 请注意,您可能希望以不同方式处理部分窗口。检查它的文档。

上一行、当前行和下一行的滚动平均值
现在让我们将它用于沿着数据框的ANOM 变量的所需滑动窗口。我们知道输出是双打,我们使用slide_dbl() 函数(否则你会得到一个列表列)。
最初的问题是关于前一行、当前行和下一行的滚动平均值。因此,我们根据步长适当地设置了.before.after

df %>% 
  mutate(TMA = slide_dbl(ANOM, mean, .before = 1, .after = 1))

# A tibble: 6 x 3
  Data     ANOM    TMA
  <chr>   <dbl>  <dbl>
1 2021-03 -0.79 -0.755
2 2021-04 -0.72 -0.657
3 2021-05 -0.46 -0.487
4 2021-06 -0.28 -0.373
5 2021-07 -0.38 -0.37 
6 2021-08 -0.45 -0.415

【讨论】:

  • 非常感谢雷!对我来说效果很好!!
  • 如果解决方案运行良好,您可能想投票给它或任何其他答案 a) 作为一个有用的答案和/或 b) 当您接受一个答案时,以便其他人看看它是否有帮助,以防万一遇到类似的问题。
【解决方案2】:

稍微不同且更详细的解决方案是:

library(tidyverse)

df <- tibble(
    Data = c("2021-03", "2021-04","2021-05","2021-06","2021-07","2021-08"),
    ANOM = c(-0.79,-0.72,-0.46,-0.28,-0.38,-0.45))

df %>%
  mutate(ANOM_lead = lead(ANOM),
         ANOM_lag  = lag(ANOM),
         ANOM_avg  = rowMeans(across(c(ANOM, ANOM_lead, ANOM_lag))))

# A tibble: 6 x 5
  Data     ANOM ANOM_lead ANOM_lag ANOM_avg
  <chr>   <dbl>     <dbl>    <dbl>    <dbl>
1 2021-03 -0.79     -0.72    NA      NA    
2 2021-04 -0.72     -0.46    -0.79   -0.657
3 2021-05 -0.46     -0.28    -0.72   -0.487
4 2021-06 -0.28     -0.38    -0.46   -0.373
5 2021-07 -0.38     -0.45    -0.28   -0.37 
6 2021-08 -0.45     NA       -0.38   NA    

在这里,我们首先为 ANOM 创建超前和滞后变量,然后简单地获取行均值。是否还想计算第一行和最后一行的平均值取决于您,您可以使用 rowMeans 函数的 na.rm = TRUE 参数来控制。当然,您也可以在之后使用select 命令省略前导和滞后变量。

【讨论】:

    猜你喜欢
    • 2017-09-20
    • 2018-09-04
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2023-03-24
    • 2011-05-17
    • 2022-01-12
    相关资源
    最近更新 更多