You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用sample()为data.frame每行生成不同范围的随机整数并新增列

解决逐行生成不同范围随机整数的问题

嘿,我完全get到你的需求——给foo这个12071行的data.frame,每行根据对应的上限K,生成1到K之间的随机整数并放到新列L里,而且每个整数被选中的概率得均等对吧?这里有几个实用的方案,从直观易上手到高效优化的都有:

方法1:用Base R的apply()逐行处理

这是最直观的写法,适合快速验证逻辑。假设你的foo已经有一列名为K来存储每行的上限值:

# 生成新列L
foo$L <- apply(foo, 1, function(row) {
  # 取出当前行的K值,确保转换为整数类型
  k <- as.integer(row["K"])
  # 从1到k中随机抽取1个整数
  sample(1:k, size = 1)
})

如果你的K列原本是字符类型,一定要用as.integer()转成整数,不然会触发采样范围的错误哦。

方法2:更高效的向量化方法(推荐)

apply()本质是逐行循环,1万多行的数据虽然也能跑,但向量化方法的速度会更优,这里推荐两种写法:

用Base R的mapply()

直接操作K列的向量,不用遍历整个data.frame的行,代码更轻量化:

foo$L <- mapply(function(k) sample(1:k, size = 1), foo$K)

用purrr包的map_int()

如果你习惯tidyverse的风格,这个写法更简洁,而且会直接返回整数向量,完美匹配列的类型:

library(purrr)
foo$L <- map_int(foo$K, ~sample(1:.x, 1))

边界情况处理

如果你的K列可能存在小于1的值或者NA,可以加个判断避免代码报错:

# 带异常值处理的mapply版本
foo$L <- mapply(function(k) {
  if (is.na(k) || k < 1) {
    NA_integer_  # 遇到无效值返回NA
  } else {
    sample(1:k, size = 1)
  }
}, foo$K)

这样不管K里有什么异常值,代码都能稳定运行啦~

内容的提问来源于stack exchange,提问作者Michelle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:30:17