如何生成仅含唯一最大值的数据集?解决R语言多最大值警告
解决R中多最大值引发的警告问题
当使用max()获取向量最大值后,若向量存在多个相同最大值,后续筛选对应元素时会触发「argument 'replacement' has length > 1 and only the first element will be used」警告。以下是修改后的代码,确保生成的数据集里目标向量仅有一个最大值,不满足则自动重新生成数据:
<<echo=FALSE, results=hide>>= ## 数据生成函数 create_table <- function() { n_a <- sample(10:25, 1) n_b <- 50 - n_a n_c <- sample(10:25, 1) n_d <- 50 - n_c # 生成各列多项分布数据 A <- rmultinom(1, n_a, prob = c(0.1, 0.2, 0.3, 0.4)) F <- rmultinom(1, n_b, prob = c(0.2, 0.1, 0.4, 0.3)) I <- rmultinom(1, n_c, prob = c(0.3, 0.4, 0.2, 0.1)) P <- rmultinom(1, n_d, prob = c(0.4, 0.3, 0.1, 0.2)) # 组合为带维度名称的矩阵 matrix(c(A, F, I, P), nrow = 4, dimnames = list(c("7", "8", "9", "10"), c("3", "4", "5", "6"))) } # 初始生成数据集 public <- create_table() # 随机选择问题类型 variant <- sample(1:2, 1) margins <- list(1, 2, NULL) # 计算百分比并保留两位小数 prop_public <- round(100 * prop.table(public, margins[[variant]]), digits = 2) # 确保百分比无重复值 while (length(prop_public) != length(unique(prop_public))) { public <- create_table() prop_public <- round(100 * prop.table(public, margins[[variant]]), digits = 2) } ## 问题与答案生成 public prop_public # 定义行/列名称列表 states = list(c("7", "8", "9", "10"), c("3", "4", "5", "6")) # 生成对应问题(西班牙语) q3 <- switch(variant, paste0("¿Cuál es la calificación más frecuente en Física"), paste0("¿Cuál es la calificación más frecuente en la asignatura optativa? ") ) # -------------------------- # 新增:确保列总和仅有一个最大值 # -------------------------- repeat { # 计算各列总和 w1 <- public[1,"3"] + public[2,"3"] + public[3,"3"] + public[4,"3"] w2 <- public[1,"4"] + public[2,"4"] + public[3,"4"] + public[4,"4"] w3 <- public[1,"5"] + public[2,"5"] + public[3,"5"] + public[4,"5"] w4 <- public[1,"6"] + public[2,"6"] + public[3,"6"] + public[4,"6"] w_vec <- c(w1, w2, w3, w4) # 统计最大值出现次数 max_freq <- sum(w_vec == max(w_vec)) # 仅当最大值唯一时跳出循环 if (max_freq == 1) break # 否则重新生成数据集 public <- create_table() } v <- max(c(w1, w2, w3, w4)) grupos = c("3", "4", "5", "6") ans <- grupos[c(w1==v, w2==v, w3==v, w4==v)] c(w1,w2,w3,w4) # -------------------------- # 新增:确保行总和仅有一个最大值 # -------------------------- repeat { # 计算各行总和 v1 <- public["7",1] + public["7",2] + public["7",3] + public["7",4] v2 <- public["8",1] + public["8",2] + public["8",3] + public["8",4] v3 <- public["9",1] + public["9",2] + public["9",3] + public["9",4] v4 <- public["10",1] + public["10",2] + public["10",3] + public["10",4] v_vec <- c(v1, v2, v3, v4) max_freq <- sum(v_vec == max(v_vec)) if (max_freq == 1) break public <- create_table() } h1 <- max(c(v1, v2, v3, v4)) grupos1 = c("7", "8", "9", "10") ans1 <- grupos1[c(v1==h1, v2==h1, v3==h1, v4==h1)] c(v1,v2,v3,v4) # 根据问题类型选择答案 sol <- switch(variant, ans, ans1 ) @
核心修改点
- 针对列总和(
w1-w4)和行总和(v1-v4)分别添加repeat循环,每次生成数据后统计最大值的出现次数。 - 通过
sum(w_vec == max(w_vec))判断最大值是否唯一,只有当结果为1时才停止循环,否则重新生成数据集。 - 保证后续筛选答案(
ans/ans1)时只会得到单个元素,彻底避免触发「replacement长度大于1」的警告。
内容的提问来源于stack exchange,提问作者Amelia
相关产品推荐
相关产品推荐

