【问题标题】:How to calculate average of specific rows in a column in R如何计算R中列中特定行的平均值
【发布时间】:2021-08-28 04:01:52
【问题描述】:

我的数据框(股市信息)有大约 100 个组(股票),每个组(股票)有 25 个观察值(行 - 1 次/天)。它看起来像这样。

Stock   Day   Price   Volume

A       1     x       y 
A       2     a       b
.
.
A       25    c       d
B       1     p       q 
B       2     r       s
.
.
B       25    t       u
.
.
.
XX       1     e       f
XX       2     g       h
.
.
XX       25    i       j

现在我想计算每组(股票)过去 3 天(第 1-3 天)、5 天(第 1-5 天)和后面 20 天(第 5 - 25 天)的平均价格和交易量)。

结果将如下所示

Stock Pr/3D/Avg Pr/5D/Avg Pr/20D/Avg Vo/3D/Avg Vo/5D/Avg Vo/20D/Avg

A      a1         b1         c1        d1         e1        f1
B      g1         h1         i1        j1         k1        l1
.
.
.
XX     m1         n1          o1       p1         q1        r1

我该怎么做?

我试过 head,但它只占用第一组的第一行。 我觉得有一个更简单的方法。

【问题讨论】:

    标签: r average


    【解决方案1】:

    使用dplyr,这是一种方法-

    library(dplyr)
    
    df %>%
      group_by(Stock) %>%
      summarise(across(c(Price,Volume), 
                list(avg_3D = ~mean(.[match(1:3, Day)], na.rm = TRUE), 
                     avg_5D = ~mean(.[match(1:5, Day)], na.rm = TRUE), 
                     avg_20D = ~mean(.[match(5:25, Day)], na.rm = TRUE))))
    
    #  Stock Price_avg_3D Price_avg_5D Price_avg_20D Volume_avg_3D Volume_avg_5D Volume_avg_20D
    #  <chr>        <dbl>        <dbl>         <dbl>         <dbl>         <dbl>          <dbl>
    #1 A            0.256        0.194       -0.0796        0.0606        0.265         -0.0616
    #2 B           -0.232       -0.116        0.209        -0.160        -0.0875         0.351 
    

    我使用了match 而不是headtail,因为如果数据中不存在特定日期,它将为其返回NA(将使用na.rm = TRUE 删除)但@987654329 @ 和 tail 将返回不正确的值。

    数据

    如果您在reproducible format 中提供数据会更容易提供帮助-

    set.seed(123)
    df <- data.frame(Stock = rep(c('A', 'B'), each  =25), 
                     Day = 1:25, 
                     Price = rnorm(50), 
                     Volume = rnorm(50))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-04
      • 2021-02-08
      • 2023-03-21
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      相关资源
      最近更新 更多