【问题标题】:Find highest values whose cumulative sum reaches limit查找累积总和达到限制的最大值
【发布时间】:2019-08-29 21:37:20
【问题描述】:

我有以下类型的数据框,代表每家公司每年发行的金融产品的数量,以及这些数量在每年总发行量中所占的百分比。

  year           company       Volume     Volume Year          %
1 2013            AWK      347902000    21927606761     0.015865936
2 2013            DAR      177977000    21927606761     0.008116572
3 2013            DTC      615627000    21927606761     0.028075431
4 2013            GMT      538456000    21927606761     0.024556077
5 2013            CLW      407497000    21927606761     0.018583743
6 2013            AYI       31970000    21927606761     0.001457979

对于每一年,我想选择最大的发行公司,它们合计占市场总量的 70%。

我可以手动执行此操作,但我正在寻找一个可以轻松应用于我的大型数据集的公式,并且将来可以大量使用!

【问题讨论】:

  • 请尝试自己编写代码,然后告诉我们您遇到的问题。只需将其分解为子问题。首先,您将如何添加一个新列 PctVol,以显示该年每家公司的交易量占总市场交易量的百分比?接下来,按年份对数据帧进行排序,然后按 PctVol 的降序排列。等等
  • @smci '%' 行表示每家公司的交易量占当年总市场交易量的百分比。当然,我可以每年手动执行此操作,我正在寻找更快的公式,因为我的数据集非常大,将来我将不得不执行很多相同的过程!
  • RomainBerrou:没有任何关于它的手册:如果您只是按照我的提示进行操作,您将很快达到对cumsum(PctVol) 的需求。自从officially we're not supposed to spoonfeed users 以来,我不想一次给你所有的提示。您确实应该在发布问题之前尝试编写一三行代码,至少可以帮助您根据特定的代码问题(不仅仅是“这是我的规范”)来构建问题。
  • Smci:不是故意冒犯你的。在决定在线询问之前,我已经写了很多行代码,但没有一个真正有意义,所以我决定不发布任何代码。但我理解你的意思,不会再这样做了,特别是如果这意味着要得到居高临下的反馈作为回报。
  • 欢迎来到 SO,一旦您开始回答问题,您可能会对这些用户产生新的同理心。

标签: r cumulative-sum


【解决方案1】:

您可以先按年份和数量排序,然后使用 ave 每年创建一个 cumsum,然后选择低于 70% 的那些:

tt  <- read.table(header=T, text="year           company       Volume     VolumeYear          p
2013            AWK      347902000    21927606761     0.015865936
2013            DAR      177977000    21927606761     0.008116572
2013            DTC      615627000    21927606761     0.028075431
2013            GMT      538456000    21927606761     0.024556077
2013            CLW      407497000    21927606761     0.018583743
2013            AYI       31970000    21927606761     0.001457979")

tt <- tt[with(tt, order(year, -Volume)),]
tt$pc  <- with(tt, ave(p, year, FUN=cumsum))
tt[tt$pc <= .7, c("year","company")]

【讨论】:

    【解决方案2】:

    使用 dplyr 库(并假设您的 data.frame 是 DF):

    library(dplyr)
    
    trimmed_DF = DF %>% 
       mutate(percentage = Volume/VolumeYear) %>%    # you already have this column, though.
       group_by(year) %>% 
       mutate(new_col = cumsum(percentage)) %>%
       filter(new_col > 0.30)                        # 0.3 = 1 - 0.7
    

    【讨论】:

      猜你喜欢
      • 2022-12-31
      • 2022-06-10
      • 1970-01-01
      • 2021-02-28
      • 2021-08-31
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      相关资源
      最近更新 更多