在R中如何按指定概率为不同活动组随机分配休闲活动时长
错误原因
sample()函数要求prob参数的长度必须和待采样向量x的长度完全一致,你的代码中待采样的mynumbers有10个元素,但prob只给了4个值,长度不匹配触发报错。- 原有代码逻辑不符合需求:
sample()的作用是从给定向量中随机抽取元素,无法实现「将单人总时长按概率拆分为4类活动时长」的目标。 - 你的代码中还存在笔误:活动b的原始概率为0.2,你写的
myprob里误填为0.3。
实现方案
核心逻辑分为两步:先按正态分布生成10人的总休闲时长,再对每个用户的总时长按4类活动的概率拆分,提供两种拆分逻辑可选:
- 固定比例拆分:严格按给定概率分配时长,结果完全符合概率比例
- 带随机波动的拆分:用多项分布模拟真实使用场景的随机差异,整体统计层面符合给定概率,单个用户的分配比例有合理波动
可运行代码
# 基础参数配置 activity_prob <- c(a = 0.4, b = 0.2, c = 0.33, d = 0.07) user_num <- 10 mu <- 2 sigma <- 0.4 # 生成10人的总休闲时长 total_leisure_time <- rnorm(user_num, mean = mu, sd = sigma) # 定义时长分配函数 allocate_time <- function(total, prob) { # 方案1:固定比例分配,注释掉下行换方案2即可 return(total * prob) # 方案2:带随机波动的分配,按分钟精度生成随机分配再转回小时 # return(as.vector(rmultinom(1, size = round(total * 60), prob = prob)) / 60) } # 批量生成所有用户的活动时长结果 result <- t(sapply(total_leisure_time, allocate_time, prob = activity_prob)) # 追加总时长列用于核对 result <- cbind(result, total = rowSums(result)) # 输出结果 print(result)
如果需要输出为更易读的格式,可以直接转成数据框:as.data.frame(result)
内容的提问来源于stack exchange,提问作者SHIRLEEN
相关产品推荐
相关产品推荐

