如何在R中按supps分组及算术条件为指定变量生成随机值
R实现方案
第一步:加载依赖包
library(dplyr) library(lubridate) library(tidyr) library(purrr)
第二步:原始数据预处理
先把日期列转为标准格式,筛选出6月的有效数据:
# 你提供的原始数据集 mydata=structure(list(supps = c("KR", "KR", "KR", "KR", "KR", "KR", "KR", "KR", "KR", "KR", "aeroclub", "aeroclub", "aeroclub", "aeroclub", "aeroclub", "aeroclub", "aeroclub", "aeroclub", "aeroclub", "aeroclub" ), date = c("01.05.2021", "01.06.2021", "02.05.2021", "02.06.2021", "03.05.2021", "03.06.2021", "04.05.2021", "04.06.2021", "05.05.2021", "05.06.2021", "01.05.2021", "01.06.2021", "02.05.2021", "02.06.2021", "03.05.2021", "03.06.2021", "04.05.2021", "04.06.2021", "05.05.2021", "05.06.2021"), turnover = c(0, 0, 32159.00888, 25220.0027, 0, 0, 245312.682, 189901.1224, 0, 0, 1531959.833, 1591612, 1834696.667, 1885169, 1871615.167, 1823398, 4891342, 5253701.167, 0, 0), fee = c(0, 0, 651, 37, 0, 0, 2341, 7548, 0, 0, 40519.5, 30415, 34767.66667, 39289, 39175.66667, 45798, 94819.5, 116803.1667, 0, 0), comiss = c(0, 0, 764.81, 537.67, 0, 0, 8578.25, 6198.115, 0, 0, -2023.41, -1941.67, -550.82, 1323.23, -1029.47, -638.47, -1034.58, -1332.95, 0, 0 ), intencive = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 26.4, 1945.8, 2199.48, 3740.76, 6499.2, 32188.68, 42337.44, 0, 0)), class = "data.frame", row.names = c(NA, -20L)) # 日期格式转换、筛选6月数据 mydata_clean <- mydata %>% mutate(date = dmy(date), month = month(date)) %>% filter(month == 6)
第三步:按规则生成4天预测值
# 可选:设置随机种子,保证结果可复现,不需要可删除 set.seed(123) pred_result <- mydata_clean %>% # 转长格式,对每个指标单独处理 pivot_longer(cols = c(turnover, fee, comiss, intencive), names_to = "indicator", values_to = "value") %>% filter(value != 0) %>% # 过滤零值 group_by(supps, indicator) %>% arrange(date) %>% slice_tail(n = 2) %>% # 取最近两个非零值 summarise(prev_val = first(value), latest_val = last(value), .groups = "drop") %>% # 计算基准值和增减符号 mutate(sum_val = prev_val + latest_val, sign = ifelse(latest_val > prev_val, 1, -1)) %>% # 生成4天随机值 rowwise() %>% mutate(pred = list( tibble( date = seq(dmy("05.06.2021"), dmy("08.06.2021"), by = "1 day"), value = sum_val * (1 + sign * runif(4, min = 0.02, max = 0.1)) ) )) %>% unnest(pred) %>% # 转回和原始数据一致的宽格式 pivot_wider(id_cols = c(supps, date), names_from = indicator, values_from = value) %>% # 可选:把日期转回原始的dd.mm.yyyy字符串格式 mutate(date = format(date, "%d.%m.%Y"))
补充说明
- 若需要把生成的预测数据和原始数据合并,直接执行
bind_rows(mydata, pred_result)即可 - 特殊情况处理:如果某组某指标全为0(比如KR分组的intencive),可以在
summarise步骤前加判断逻辑,直接生成全0的预测值即可
内容的提问来源于stack exchange,提问作者psysky
相关产品推荐
相关产品推荐

