如何在R中无循环按均值对列表元素进行排序?
解决方案:按列表元素均值排序列表
原代码问题分析
你的代码存在两个核心问题:
function1中sort(mean(x), decreasing = T)逻辑错误:mean(x)返回单个数值,对单个值排序没有意义,这个函数应该仅负责计算单个列表元素的均值,而非排序。function2中lapply(function1, x)参数顺序颠倒,且即便修正参数,也只能得到各元素的均值向量,无法将原列表元素与均值同步排序。
最简实现(无循环)
用基础R的sapply计算均值,再通过order获取排序索引,直接对原列表重新索引即可实现需求:
sort_list_by_mean <- function(input_list) { # 计算每个列表元素的均值,得到对应长度的向量 element_means <- sapply(input_list, mean) # 按均值降序的索引,重新排列原列表 input_list[order(element_means, decreasing = TRUE)] } # 测试示例 testlist <- list(c(10, 5, 1), c(3, 2), c(77, 90, 1), c(23, 34), c(2, 35, 22)) sort_list_by_mean(testlist)
代码解释
sapply(input_list, mean):遍历输入列表的每个元素,计算对应均值,返回一个与列表长度一致的数值向量,每个位置的数值对应原列表中对应元素的均值。order(element_means, decreasing = TRUE):生成均值从大到小的索引顺序,用这个索引去取原列表的元素,就能实现列表元素按均值降序排列。
验证结果
你的测试列表各元素均值分别为:5.33、2.5、56、28.5、19.67,排序后列表顺序为:c(77,90,1)(均值56)→ c(23,34)(均值28.5)→ c(2,35,22)(均值19.67)→ c(10,5,1)(均值5.33)→ c(3,2)(均值2.5),与代码运行结果一致。
内容的提问来源于stack exchange,提问作者xin hwa
相关产品推荐
相关产品推荐

