R语言:如何按列名和行循环函数,按比例生成二项式感染标记?
在R中根据列值生成对应概率的二项式标记
首先说明:你提到的“列表”大概率是R中的数据框(data frame),这是处理表格数据最常用的结构,下面的示例都基于数据框展开。
步骤1:准备示例数据(可替换成你的真实数据)
先创建一个模拟数据框方便演示,你可以把df换成自己的数据框,age换成你要处理的目标列名:
# 设置随机种子,让结果可重复 set.seed(123) df <- data.frame( col1 = rnorm(100), col2 = runif(100), age = sample(c(15,16,17,18), 100, replace = TRUE), # 目标列,包含15、16等取值 col4 = sample(letters, 100, replace = TRUE), col5 = sample(1:10, 100, replace = TRUE) )
步骤2:定义值与感染概率的映射
把不同目标值对应的感染概率存成命名向量,方便后续调用:
prob_map <- c( "15" = 0.001, # 15对应0.1%感染概率 "16" = 0.005, # 16对应0.5%感染概率 "17" = 0.01, # 示例:17对应1%感染概率 "18" = 0.02 # 示例:18对应2%感染概率 ) # 可以继续添加更多值和对应的概率
方法一:用循环实现(适合新手理解逻辑)
既然你刚接触循环,先写最直观的for循环:
# 新增一列infection,初始值设为0 df$infection <- 0 # 遍历每一行 for (i in 1:nrow(df)) { # 取出当前行目标列的值,转成字符匹配命名向量的键 current_val <- as.character(df$age[i]) # 获取对应感染概率 p <- prob_map[current_val] # 生成二项式随机数:1次试验,概率p,结果0(未感染)或1(感染) df$infection[i] <- rbinom(n = 1, size = 1, prob = p) }
方法二:向量化操作(更高效,推荐)
R的优势是向量化运算,不用循环也能快速完成,这里提供两种方式:
方式1:基础R的mapply函数
df$infection <- mapply( function(x) rbinom(n = 1, size = 1, prob = prob_map[as.character(x)]), df$age )
方式2:用dplyr包(语法更清晰)
如果习惯用管道语法,dplyr会更友好:
# 没安装的话先执行:install.packages("dplyr") library(dplyr) df <- df %>% mutate( infection = case_when( age == 15 ~ rbinom(n(), 1, 0.001), age == 16 ~ rbinom(n(), 1, 0.005), age == 17 ~ rbinom(n(), 1, 0.01), age == 18 ~ rbinom(n(), 1, 0.02), TRUE ~ 0 # 对未定义的值,默认感染概率为0 ) )
关键函数说明
rbinom(n, size, prob):生成二项分布随机数,参数分别是生成数量、单次试验次数、成功概率。这里每次生成1个值,对应1次“是否感染”的试验。- 命名向量
prob_map:通过字符匹配快速获取对应概率,避免大量if-else判断。
内容的提问来源于stack exchange,提问作者Katy Baker
相关产品推荐
相关产品推荐

