在R语言中从数组列表筛选元素和最小的最优数组
解决方法:从数组列表中选出元素和最小的最优数组
首先,你的需求核心是找到列表中所有元素总和最小的数组,我们可以通过计算每个数组的总和,再定位到总和最小的那个元素来实现。下面分两种场景给出方案:
1. 基础场景:直接选出最优数组
先给你一个简单的实现,不需要复杂循环就能完成需求:
# 先定义你的数据(和你提供的一致) v1 = c(5,5,5,5) v2 = c(6,6,6,6) v3 = c(7,7,7,7) v4 = c(8,8,8,8) v5 = c(1,1,1,1) v6 = c(2,2,2,2) v7 = c(3,3,3,3) v8 = c(4,4,4,4) arr1 = array(c(v1,v2,v3,v4), dim = c(4,4)) arr2 = array(c(v5,v6,v7,v8), dim = c(4,4)) myList = list(arr1,arr2) # 计算每个数组的元素总和 sum_list <- lapply(myList, sum) # 找到总和最小的数组的索引 min_index <- which.min(unlist(sum_list)) # 提取最优数组 best_array <- myList[[min_index]] # 验证一下:输出最优数组的总和和数组本身 cat("最优数组的总和:", sum(best_array), "\n") print(best_array)
这段代码会输出arr2,因为它的总和是1+1+1+1 + 2+2+2+2 + 3+3+3+3 +4+4+4+4 = 40,而arr1的总和是5*4 +6*4 +7*4 +8*4= 104,显然arr2是最优的。
2. 适配你提到的循环场景
你提到要在类似while(length(A...的循环中完成,假设你的循环是要持续处理列表(比如每次选出最优数组后,可能移除它或者做其他操作),可以把逻辑整合到循环里:
solve <- function() { A <- myList # 假设循环条件是列表长度大于0,你可以根据实际需求修改 while(length(A) > 0) { # 计算当前列表中每个数组的总和 current_sums <- sapply(A, sum) # 找到当前最优数组的索引 current_min_idx <- which.min(current_sums) current_best <- A[[current_min_idx]] # 这里可以添加你需要对最优数组执行的操作,比如打印、存储、处理等 cat("当前最优数组总和:", sum(current_best), "\n") print(current_best) # 示例:移除当前最优数组,继续循环(根据你的实际需求调整这一步) A <- A[-current_min_idx] } } # 调用函数 solve()
关键函数说明
sum():计算单个数组的所有元素总和,因为数组本质是多维向量,sum()会直接把所有元素加起来。lapply()/sapply():遍历列表中的每个数组,分别计算总和。sapply()会返回一个向量,比lapply()的列表结果更方便用which.min()处理。which.min():返回向量中最小值的位置索引,用这个索引就能从列表中提取对应的最优数组。
如果你的循环有特殊的终止条件或者处理逻辑,只需要修改while的判断条件和循环内的操作即可。
内容的提问来源于stack exchange,提问作者Branislav Kramár
相关产品推荐
相关产品推荐

