如何在R中从有序字符向量列表交替随机选取256个不重复元素?
问题解决思路与修正代码
你的核心需求是按向量从小到大的顺序交替随机抽取不重复元素,直到凑够256个。现有代码存在循环逻辑错误、抽取对象错误、终止条件判断错误等问题,以下是修正方案:
核心问题分析
- 循环遍历向量本身而非索引,无法实现交替抽取的逻辑
sample(files_train, 1)是从列表中随机选一个向量,而非从当前目标向量中选元素- 终止条件用
sum(sapply(selected_files, length))判断错误,直接用length(selected_files)即可统计总抽取数量 - 未处理小向量(仅18个元素的第一个向量)取完后无法继续抽取的情况
修正代码
# 1. 先对每个向量内部元素随机打乱,保证抽取随机性且不重复取同一向量内的元素 shuffled_vecs <- lapply(files_train, sample) selected_files <- c() vec_count <- length(shuffled_vecs) # 向量总数(本次为3) # 2. 循环交替抽取元素,直到凑够256个 while (length(selected_files) < 256) { # 按向量从小到大的顺序依次抽取 for (i in 1:vec_count) { # 仅当当前向量还有剩余元素,且未选够256个时执行抽取 if (length(shuffled_vecs[[i]]) > 0 && length(selected_files) < 256) { # 取当前向量的第一个元素(已打乱,等价随机抽取) picked <- shuffled_vecs[[i]][1] selected_files <- c(selected_files, picked) # 移除已抽取的元素,避免重复选取 shuffled_vecs[[i]] <- shuffled_vecs[[i]][-1] } } } # 3. 确保最终选中的元素完全不重复(若原向量间存在重复元素) selected_files <- unique(selected_files) # 4. 若去重后数量不足256,从剩余元素中补全(根据你的数据量,大概率不需要这一步) if (length(selected_files) < 256) { remaining <- unlist(shuffled_vecs) selected_files <- c(selected_files, sample(remaining, 256 - length(selected_files), replace = FALSE)) }
代码说明
lapply(files_train, sample):将每个向量的元素随机打乱,后续每次取第一个元素就相当于随机抽取,且不会重复选取同一向量内的元素- 外层
while循环控制总抽取数量,内层for循环保证按向量从小到大的顺序交替抽取 - 当第一个向量的18个元素取完后,后续循环会自动跳过它,只从剩余两个向量继续交替抽取
- 最后通过
unique处理跨向量的重复元素,确保最终结果无重复
内容的提问来源于stack exchange,提问作者Wilson Souza
相关产品推荐
相关产品推荐

