如何按R数据帧中的连续行分组?

时间:2019-07-03 15:51:17

标签: r

我有一个数据框,其中包含时间序列数据中的时间戳,类型,值列。类型指的是峰还是谷。我要:

按连续类型对所有数据进行分组 对于“峰值”类型的组,我想选择最高的 对于团体,如果“山谷”类型,我想选择最低的 按这些最高/最低过滤数据框 期望值:我会有一个数据框,在最高峰和最低谷之间交替显示每一行。

我知道如何执行此操作的唯一方法是使用for循环,然后将连续值添加到向量中,然后获取最大值,然后将其推到新的数据帧中,依此类推。

对于那些了解python的人,这就是我所做的(不过我需要将我的代码转移到R中):

segmentation['min_v'] = segmentation.groupby( segmentation.pv_type.ne(segmentation.pv_type.shift()).cumsum() ).price.transform(min)
segmentation['max_p'] = segmentation.groupby( segmentation.segmentation.pv_type.ne(segmentation.pv_type.shift()).cumsum() ).price.transform(max)

编辑

样本数据集:

types <- c('peak', 'peak', 'valley', 'peak', 'valley', 'valley', 'valley')
values <- c(1.01,   1.00,    0.4,     1.2,     0.3,      0.1,      0.2)
segmentation <- data.frame(types, values)
segmentation

expectedTypes <- c('peak', 'valley', 'peak', 'valley')
expectedValues <- c(1.00, 0.4, 1.2, 0.1 )
expectedResult <- data.frame(expectedTypes, expectedValues)
expectedResult

我不知道一种更好的方法来生成数据。

1 个答案:

答案 0 :(得分:0)

使用R时,使用dplyr的实现是将'pv_type'和'pv_type'的lag之间的逻辑比较的累积和作为分组列,并且然后获得“价格”的minmax作为两个新列

library(dplyr)
segmentation %>%
       group_by(pv_type_group = cumsum(pv_type != lag(pv_type,
                 default = first(pv_type))) %>%
       mutate(min_v = min(price), max_p = max(price))

更新

以OP的示例为例,预期输出为summarise d,因此我们使用summarise而不是mutate。另外,使用rleid(来自data.table)代替逻辑累计和

library(data.table)
segmentation %>% 
    group_by(grp = rleid(types)) %>% 
    summarise(types = first(types), expectedvalues = min(values)) %>%
    ungroup %>%
    select(-grp)
# A tibble: 4 x 2
#  types  expectedvalues
# <fct>           <dbl>
#1 peak              1  
#2 valley            0.4
#3 peak              1.2
#4 valley            0.1