【问题标题】:R get the value of one column that's based on several other columns and the max of one?R获取基于其他几列的一列的值和一列的最大值?
【发布时间】:2019-01-31 02:37:04
【问题描述】:

我看到类似 (Extract the maximum value within each group in a dataframe) 的 R 问题,但没有一个能真正满足我的需要。

我清理过的数据如下所示:

      date ticker openprice lowprice closeprice hour min
2015-11-17    EXC     28.53    28.52      28.54    9  31
2015-11-17    EXC     28.53    28.52      28.58    9  32
2015-11-17    EXC     28.57    28.54      28.57    9  33
2015-11-17    AEP     28.59    28.59      28.66    9  34
2015-11-17    AEP     28.66    28.63      28.65    9  35
2015-11-17    AEP     28.64    28.63      28.65    9  36
2015-11-18    EXC     28.53    28.52      28.54    9  31
2015-11-18    EXC     28.53    28.52      28.58    9  32
2015-11-18    EXC     28.57    28.54      28.57    9  33
2015-11-18    AEP     28.59    28.59      28.66    9  34
2015-11-18    AEP     28.66    28.63      28.65    9  35
2015-11-18    AEP     28.64    28.63      28.65    9  36

然后,我需要在每个小时、代码和日期的最小值 min 处获取 closeprice 的值,然后再次在每个小时、代码和日期的最小值处获取 closeprice 的值。

上述小样本的解决方案是这样的(不完全是这样,但你知道我在追求什么):

date, ticker, hour, hour_beginning_price, hour_end_price
2015-11-17, EXC, 9, 28.54, 28.57
2015-11-17, AEP, 9, 28.66, 28.65
2015-11-18, EXC, 9, 29.54, 29.57
2015-11-18, AEP, 9, 29.66, 29.65

因此您可以在 R 中加载示例数据:

blep<-read.table(header = TRUE, text = '          date ticker openprice lowprice closeprice hour min
    2015-11-17    EXC     28.53    28.52      28.54    9  31
    2015-11-17    EXC     28.53    28.52      28.58    9  32
    2015-11-17    EXC     28.57    28.54      28.57    9  33
    2015-11-17    AEP     28.59    28.59      28.66    9  34
    2015-11-17    AEP     28.66    28.63      28.65    9  35
    2015-11-17    AEP     28.64    28.63      28.65    9  36
    2015-11-18    EXC     28.53    28.52      29.54    9  31
    2015-11-18    EXC     28.53    28.52      29.58    9  32
    2015-11-18    EXC     28.57    28.54      29.57    9  33
    2015-11-18    AEP     28.59    28.59      29.66    9  34
    2015-11-18    AEP     28.66    28.63      29.65    9  35
    2015-11-18    AEP     28.64    28.63      29.65    9  36')

我一直在尝试学习如何做到这一点并且一无所获,我总是尝试先自己解决我的问题,但我不确定如何正确地将聚合的输出与 which 结合起来,或者如果这甚至是正确的方法:

which(apply(sd, function(x) all(x == aggregate(sd$min, by = list(sd$date, sd$ticker, sd$hour), max))))

【问题讨论】:

    标签: r


    【解决方案1】:

    这是使用 dplyr 的解决方案:

    library(dplyr)
    
    blep %>% 
      group_by(date, ticker, hour) %>% 
      arrange(date, ticker, hour, min) %>% 
      summarize(hour_beginning_price = first(closeprice),
                hour_end_price = last(closeprice))
    

    关键是按分钟(min)排序,这样第一条记录是每组内分钟的最小值,最后一条记录是分钟的最大值。

    【讨论】:

    • 您可以通过将第二个管道命令替换为arrange(min) 来简化此操作,因为这将通过增加min 的顺序排列在每个组内
    猜你喜欢
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 2021-02-19
    • 2016-10-15
    • 2020-05-20
    相关资源
    最近更新 更多