如何为每周数据替换为单天随机值?R语言采样频率调整需求
解决方案
要实现每个周单独随机选择一天,并将该天的y值填充到该周所有行的y_week列,可以用以下两种方法:
方法1:从每周实际存在的日期中随机抽取(推荐)
这种方法避免抽到该周没有的日期,保证y_week不会出现NA:
library(dplyr) # 为每个周随机选取一行(对应一个随机日期的y值) week_selected <- data %>% group_by(Week) %>% slice_sample(n = 1) %>% select(Week, y_week = y) # 将周度y值合并回原数据框 data <- data %>% left_join(week_selected, by = "Week")
运行后,每个周的所有行都会被填充该周随机选中的那一天的y值,同时保留原有的x、y等字段。
方法2:从所有星期日期中随机抽取(允许抽到该周不存在的日期)
如果需要严格从完整星期列表中抽取日期(即使该周没有记录),可以用以下代码:
library(dplyr) weekdays <- c("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday") # 为每个周生成一个随机日期 week_rand_days <- data.frame( Week = unique(data$Week), rand_day = sample(weekdays, length(unique(data$Week)), replace = TRUE) ) # 合并随机日期并匹配对应y值 data <- data %>% left_join(week_rand_days, by = "Week") %>% group_by(Week) %>% mutate(y_week = ifelse(any(Day == rand_day), y[Day == rand_day][1], NA)) %>% select(-rand_day)
如果抽到的日期在该周没有记录,y_week会被设为NA,你可以根据需求调整这部分逻辑。
你之前代码的问题
- 全局随机而非按周随机:你之前只生成了一个全局的
randay,所有周都会用同一个日期,不符合“每个周单独选一天”的需求; - 列名大小写错误:代码中用了
data$day,但数据框的列名是Day(大写),导致匹配失败; - 未初始化列:
no = data$y_week中的y_week还未创建,会引发错误。
内容的提问来源于stack exchange,提问作者Kenny Anderson
相关产品推荐
相关产品推荐

