【问题标题】:Add a column dependent on another column and a subset (using the tidyverse)添加依赖于另一列和子集的列(使用 tidyverse)
【发布时间】:2018-09-19 02:01:01
【问题描述】:

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

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 包我想获得这个数据集,其中包含给定 Ticker 的平均交易量。

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 行以上执行此操作,因此速度和效率是关键(没有 for 循环等...)

我是 Tidyverse 的新手,希望得到答案的解释。

【问题讨论】:

    标签: r dplyr dataset


    【解决方案1】:

    尽管您要求提供一个 tidyverse 解决方案并且@akrun 已经发布了一个,但我将发布一个基本的 R 方式。

    这是因为您的问题对于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"))
    

    【讨论】:

      【解决方案2】:

      我们按“Ticker”分组,将“AvgVolume”创建为“Volume”的meanmutate

      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  
      

      【讨论】:

      • 谢谢。所以当你使用 group_by 时,然后将函数应用于 Tibble 它总是自动分离这些?我应该考虑一个数据集,它被分组为一个“tibble”中的许多数据集子集吗?
      • @HectorHaffenden 如果您在group_by 之后使用mutate,则组将被保留,除非链中存在ungroup。但是,对于summarise,分组变量之一会在每个汇总语句中被删除。关于第二个问题,不清楚
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      相关资源
      最近更新 更多