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)
问题根源
- 判断逻辑错误:原代码用
TRUE %in% lapply(judge_list, duplicated)检测重复,但duplicated()返回的是每行是否重复的布尔向量,lapply会返回包含多个布尔向量的列表,这种判断方式无法正确识别是否存在重复项。 - 分配数据源错误:循环时用已经分配过的
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
相关产品推荐
相关产品推荐

