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

R语言while循环未满足条件:文本分配给法官时重复问题求助

修复法官文本分配函数的while循环问题

问题背景

我有一个包含文本ID(Items)及对应词数(Length.in.words)的数据框,示例生成代码:

df1 <- data.frame(Items = sample(1:495, 495, replace = FALSE), Length.in.words = sample(380:820, 495, replace = TRUE))

要求每个文本需由3位法官审阅,因此将原数据框复制两次并合并:

df2 <- df1
df3 <- df1
df <- rbind(df1, df2, df3)

随后写了一个基于tidyverse和groupdata2的分配函数,用fold平衡每位法官的文本总词数,同时想用while循环确保每位法官的文本列表没有重复项:

library(tidyverse)
library(groupdata2)

sample_scripts <- function(x, judges){

all <- fold(x, num_col = "Length.in.words", k = judges)
  judge_list <- split(all, all$.folds)
  while (TRUE %in% lapply(X = judge_list, FUN = duplicated)){
    all <- fold(all, num_col = "Length.in.words", k = judges)
    judge_list <- split(all, all$.folds)
  }

  assign("judge_list", judge_list, envir = globalenv())
}

调用方式:

sample_scripts(df, 33)

但循环没起作用,每次运行后还是有法官的列表存在重复文本,用以下代码检测重复:

lapply(X = judge_list, FUN = duplicated)

问题根源

  1. 判断逻辑错误:原代码用TRUE %in% lapply(judge_list, duplicated)检测重复,但duplicated()返回的是每行是否重复的布尔向量,lapply会返回包含多个布尔向量的列表,这种判断方式无法正确识别是否存在重复项。
  2. 分配数据源错误:循环时用已经分配过的all数据框再次做fold,相当于在已有分组基础上拆分,更容易出现重复,应该从原始数据重新分配。

修复后的代码

library(tidyverse)
library(groupdata2)

sample_scripts <- function(x, judges){
  # 初始从原始数据做分配
  all <- fold(x, num_col = "Length.in.words", k = judges)
  judge_list <- split(all, all$.folds)
  
  # 定义检查函数:判断是否有法官的列表存在重复Items
  has_duplicates <- function(judge_list) {
    any(sapply(judge_list, function(df) any(duplicated(df$Items))))
  }
  
  # 循环直到所有法官的列表都没有重复
  while (has_duplicates(judge_list)) {
    # 每次都从原始输入x重新分配,避免累积问题
    all <- fold(x, num_col = "Length.in.words", k = judges)
    judge_list <- split(all, all$.folds)
  }
  
  assign("judge_list", judge_list, envir = globalenv())
}

验证方法

运行函数后,用以下代码确认所有法官的文本列表都无重复:

# 检查每个法官的Items列是否无重复
sapply(judge_list, function(df) length(unique(df$Items)) == nrow(df))

如果返回结果全为TRUE,说明分配符合要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:33:13