我有一个数据框,其中包含时间序列数据中的时间戳,类型,值列。类型指的是峰还是谷。我要:
按连续类型对所有数据进行分组 对于“峰值”类型的组,我想选择最高的 对于团体,如果“山谷”类型,我想选择最低的 按这些最高/最低过滤数据框 期望值:我会有一个数据框,在最高峰和最低谷之间交替显示每一行。
我知道如何执行此操作的唯一方法是使用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
我不知道一种更好的方法来生成数据。
答案 0 :(得分:0)
使用R
时,使用dplyr
的实现是将'pv_type'和'pv_type'的lag
之间的逻辑比较的累积和作为分组列,并且然后获得“价格”的min
和max
作为两个新列
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