代码之家  ›  专栏  ›  技术社区  ›  Hector Haffenden

添加依赖于另一列和子集的列(使用tidyverse)

  •  1
  • Hector Haffenden  · 技术社区  · 7 年前

    我有以下股票数据的数据集(作为一个tible)

    Open  Volume   Ticker
    <dbl>  <dbl>    <chr>
    1106.  10       AAL.L
    1086.  30       AAL.L
    1043.  9        ABF.L
    1055.  2        ABF.L
    1048.  90000    BT-A.L
    1077.  8000     BT-A.L
    

    使用dplyr包,我想获得这个数据集,与一个给定的股票平均交易量。

    Open  Volume   Ticker  AvgVolume
    <dbl>  <dbl>    <chr>    <dbl>
    1106.  10       AAL.L    20
    1086.  30       AAL.L    20
    1043.  9        ABF.L    5.5
    1055.  2        ABF.L    5.5 
    1048.  90000    BT-A.L   49000
    1077.  8000     BT-A.L   49000
    

    我将做这超过500000行,所以速度和效率是关键(没有循环等…)

    我是新来的Tidyverse和将感谢解释的答案。

    2 回复  |  直到 7 年前
        1
  •  1
  •   akrun    7 年前

    mean “体积”的 mutate

    library(dplyr)
    df1 %>%
       group_by(Ticker) %>%
       mutate(AvgVolume = mean(Volume))
    # A tibble: 6 x 4
    # Groups:   Ticker [3]
    #   Open Volume Ticker AvgVolume
    #  <int>  <int> <chr>      <dbl>
    #1  1106     10 AAL.L       20  
    #2  1086     30 AAL.L       20  
    #3  1043      9 ABF.L        5.5
    #4  1055      2 ABF.L        5.5
    #5  1048  90000 BT-A.L   49000  
    #6  1077   8000 BT-A.L   49000  
    
        2
  •  2
  •   Rui Barradas    7 年前

    这是因为你的问题是教科书上完美的 ave

    ave(df1$Volume, df1$Ticker)
    #[1]    20.0    20.0     5.5     5.5 49000.0 49000.0
    

    df1$AvgVolume <- ave(df1$Volume, df1$Ticker)
    df1
    ## A tibble: 6 x 4
    #   Open Volume Ticker AvgVolume
    #  <dbl>  <int> <fct>      <dbl>
    #1  1106     10 AAL.L       20  
    #2  1086     30 AAL.L       20  
    #3  1043      9 ABF.L        5.5
    #4  1055      2 ABF.L        5.5
    #5  1048  90000 BT-A.L   49000  
    #6  1077   8000 BT-A.L   49000
    

    数据。

    df1 <-
    structure(list(Open = c(1106, 1086, 1043, 1055, 1048, 1077), 
        Volume = c(10L, 30L, 9L, 2L, 90000L, 8000L), Ticker = structure(c(1L, 
        1L, 2L, 2L, 3L, 3L), .Label = c("AAL.L", "ABF.L", "BT-A.L"
        ), class = "factor"), AvgVolume = c(20, 20, 5.5, 5.5, 49000, 
        49000)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", 
    "data.frame"))