R语言按日期筛选每日最低电价时段的函数实现求助
R语言按日期筛选每日最低电价时段的函数实现求助
看起来你现在卡在按日期筛选每日最便宜电价时段的问题上啦,我来帮你梳理下问题所在,再给你个靠谱的解决方案~
首先先说说你现有代码的问题:
- 分组逻辑错了:你用
group_by(DateTime)是按每个小时来分组的,每个组里本来就只有一条数据,summarise(min(Price))其实就是取每个小时自己的价格,完全没实现“按日期分组”的目的。 - top_n的默认行为反了:
top_n(2)默认是取分组后数值最大的2条,而你要的是最便宜(数值最小)的,而且你是想在每个日期组里选2个最低价小时,不是在整个数据集里选。
接下来是正确的实现思路和代码:
我们需要先把DateTime转换成日期维度来分组,然后在每个日期组里选出价格最低的N个小时,同时保留原始的DateTime和Price信息。用slice_min()函数就能完美实现这个需求,它可以在每个分组里筛选出指定数量的最小值行。
这里给你写一个更灵活的函数,支持自定义选几个最便宜的小时:
cheapest_n_hours <- function(data, n = 2) { data %>% # 按日期分组(把DateTime转成日期格式) group_by(date = as.Date(DateTime)) %>% # 在每个日期组里选Price最小的n行,with_ties=TRUE会保留并列最低价的时段 slice_min(Price, n = n, with_ties = TRUE) %>% # 取消分组,方便后续操作 ungroup() %>% # 可选:按日期和价格排序,让结果更清晰 arrange(date, Price) }
函数参数说明:
n:你想要选的每日最便宜小时数,默认是2,你可以根据需求修改(比如改成3)with_ties=TRUE:如果某天有多个时段价格相同且都是当日最低价,这些时段都会被保留;如果只想严格选n个,不管并列,可以把这个参数改成FALSE
调用示例:
# 调用函数,获取每日最便宜的2个小时 result <- cheapest_n_hours(df, 2) print(result)
这样得到的结果就会是你想要的:每个日期下最便宜的2个(或并列的)时段,包含完整的DateTime和Price信息,按日期和价格排序好。
备注:内容来源于stack exchange,提问作者Jouni
相关产品推荐
相关产品推荐

