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

R语言中从自定义向量使用sample函数抽取数值的实现问题咨询

代码错误点梳理
  • 抽样目标对象写错:原代码里sample(1:w, roznica)的1:w并非目标向量w,R会把1:w解析为从1开始、到w的第一个元素(值为2)结束的数值序列,等价于1:2,完全无法触达w向量中的其他元素。
  • sample函数参数逻辑错位:R基础包sample()的固定参数顺序是sample(待抽样向量, 抽取样本量, 是否允许有放回, 抽样权重),原代码既把待抽样对象写错,也没有按参数位置传入对应值。
  • 循环赋值无存储设计:原循环中每次直接给roznica_proces_2覆盖赋值,没有预分配存储空间或逐次保存结果,循环跑完后只会保留最后一次的赋值内容,前面的抽样结果全部丢失。
  • 冗余循环设计:如果roznica是代表抽样数量的标量值,完全不需要套用for(x in roznica)的循环逻辑,直接通过分支判断完成赋值即可。
修正后的可运行实现
  1. 先明确定义目标抽样向量w,避免变量名混淆:
w <- c(2, 5, 13, 23, 24, 39, 41, 47, 48, 51, 52, 58, 61, 62, 70, 71, 72, 90)
  1. 标量抽样数量场景(不需要循环):
    如果你的roznica是固定的抽样个数,直接按分支逻辑写sample调用即可,注意当抽样数量大于w的总长度(共18个元素)时,必须设置replace = TRUE允许有放回抽样,否则R会抛出长度不匹配的报错。
# 变量初始化
roznica_proces_2 <- NA
licznik_1 <- 1
licznik_2 <- 2
roznica <- 3 # 这里替换为你实际需要的抽样数量

if (licznik_2 != licznik_1) {
  # 正确的sample调用:第一个参数直接传入目标向量w,第二个参数传入抽样数量
  roznica_proces_2 <- sample(x = w, size = roznica, replace = FALSE)
}
  1. 多组抽样数量场景(需要循环):
    如果roznica是由多个不同抽样数量组成的向量(比如c(2,4,6)代表分别抽2个、4个、6个样本),需要用列表存储每次的抽样结果,避免被覆盖:
roznica <- c(2, 4, 6)
# 预分配和roznica等长的列表存结果
roznica_proces_2 <- vector(mode = "list", length = length(roznica))

for (i in seq_along(roznica)) {
  if (licznik_2 != licznik_1) {
    sample_size <- roznica[i]
    # 抽样数量超过w长度时自动切换为有放回抽样
    roznica_proces_2[[i]] <- sample(
      x = w, 
      size = sample_size, 
      replace = sample_size > length(w)
    )
  } else {
    roznica_proces_2[[i]] <- NA
  }
}

常见踩坑提醒:如果传入sample的第一个参数是长度为1的数值,R会把这个值解析为从1到该数值的序列做抽样,比如sample(5,2)本质是从1:5里抽2个数,这也是很多人用sample从自定义向量抽样时得不到预期结果的核心原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 23:57:04