在R语言中生成339个符合正态分布的日期的技术求助
生成符合正态分布的日期序列(R实现)
原代码问题分析
你提供的代码无法运行的核心原因是prob参数的总和不等于1(0.2+0.2+(0.1/337)*337=0.5),不符合sample()函数对概率参数的要求,同时这种手动设置概率的方式也无法生成正态分布的日期序列。
解决方案:基于数值化日期生成正态分布
在R中,日期本质是从1970-01-01开始计数的整数(天数),我们可以利用这一特性,先生成正态分布的数值,再转换为日期,同时确保日期落在指定范围内。
完整代码如下:
# 1. 定义目标日期范围 date_start <- as.Date('2022/01/01') date_end <- as.Date('2023/01/01') # 2. 将日期转换为数值(R中日期的底层存储形式) num_start <- as.numeric(date_start) num_end <- as.numeric(date_end) # 3. 设定正态分布参数:均值取日期范围中点,标准差设为30天(可自定义调整) mean_num <- mean(c(num_start, num_end)) sd_num <- 30 # 数值越大,日期分布越分散;越小则越集中在中点附近 # 4. 生成339个正态分布数值,并截断到日期范围的数值区间(避免超出边界) norm_nums <- rnorm(n = 339, mean = mean_num, sd = sd_num) norm_nums_clamped <- pmax(pmin(norm_nums, num_end), num_start) # 5. 将数值转回日期类型 norm_dates <- as.Date(norm_nums_clamped, origin = '1970-01-01') # 可选:验证分布情况(绘制直方图) hist(norm_dates, breaks = "days", main = "正态分布日期直方图", xlab = "日期")
说明
- 生成的日期会围绕
2022-07-02(日期范围中点)呈正态分布,你可以通过调整sd_num的值控制分布的分散程度 pmax()和pmin()函数确保所有生成的日期都不会超出2022/01/01到2023/01/01的范围- 如果需要更贴合特定的正态分布特征(比如不同的均值或标准差),直接修改
mean_num和sd_num即可
内容的提问来源于stack exchange,提问作者mdb_ftl
相关产品推荐
相关产品推荐

