如何在R中筛选周度数据、计算日差周差并分组
R实现日期价格数据的日差、周差计算与分组处理
步骤1:加载依赖包
先加载数据操作和日期处理的工具包:
library(dplyr) library(lubridate)
步骤2:构造原始数据框
把给定的日期和价格转换成R可处理的格式,用dmy()解析日期字符串:
# 原始数据 df <- tibble( Date = dmy(c("2-Jul-13", "3-Jul-13", "4-Jul-13", "5-Jul-13", "8-Jul-13", "9-Jul-13", "10-Jul-13", "11-Jul-13")), Price = c(20, 22, 30, 18, 12, 24, 28, 14) ) # 若需要添加期望输出中的后续示例数据 df_extra <- tibble( Date = dmy(c("12-Jul-13", "15-Jul-13", "16-Jul-13")), Price = c(18, 12, 20) ) df <- bind_rows(df, df_extra)
步骤3:计算day_diff
用lag()函数获取前一日价格,首个值设为0(以第一行价格作为默认值):
df <- df %>% mutate(day_diff = Price - lag(Price, default = first(Price)))
步骤4:计算week_diff与按周分组
按照以首个日期为起始、每7天为一个周期的规则分组(匹配你示例中9-Jul与2-Jul的周差计算逻辑),仅在每周首个数据行填充周差值,其余行留空:
df <- df %>% # 按7天间隔划分周组 mutate(week_group = cut(Date, breaks = seq(first(Date), max(Date)+weeks(1), by="week"))) %>% # 标记每周的首个数据行 group_by(week_group) %>% mutate(is_week_first = row_number() == 1) %>% ungroup() %>% # 计算周差值:当前周首个价格 - 上一周首个价格 mutate( week_first_prices = Price[is_week_first], week_diff = if_else(is_week_first, week_first_prices - lag(week_first_prices, default = NA), NA_real_) ) %>% # 移除中间辅助列 select(-week_group, -is_week_first, -week_first_prices)
步骤5:输出结果
用print()函数输出,将NA显示为空以匹配期望格式:
print(df, na.print = "")
输出效果
最终输出如下(与期望格式一致):
Date Price day_diff week_diff 1 2013-07-02 20 0 2 2013-07-03 22 2 3 2013-07-04 30 8 4 2013-07-05 18 -12 5 2013-07-08 12 -6 6 2013-07-09 24 12 4 7 2013-07-10 28 4 8 2013-07-11 14 -14 9 2013-07-12 18 4 10 2013-07-15 12 -6 11 2013-07-16 20 8 -4
注:若你的周定义是自然周(如周一/周日起始),可修改
cut()的breaks参数,或改用lubridate::floor_date(Date, "week", week_start=1)来定义周组。
内容的提问来源于stack exchange,提问作者s pradnya
相关产品推荐
相关产品推荐

