如何通过循环对minDist列表组使用which.min函数实现分组
批量处理多个minDist列表获取分组结果
你已经知道如何对单个minDist矩阵用apply(minDist, 1, which.min)获取每行的分组(取最小值所在列),要批量处理3个这类矩阵,有两种简洁的实现方式,下面结合你提供的数据来演示:
首先构造你的3个minDist矩阵列表
先把你给出的3组数据整理成R的列表结构:
minDist_list <- list( # 第1个minDist矩阵 matrix(c(1.000000,9.055385,9.000000, 0.000000,9.000000,9.055385, 1.414214,8.062258,8.000000, 1.000000,8.000000,8.062258, 9.055385,1.000000,0.000000, 9.000000,0.000000,1.000000, 10.049876,1.414214,1.000000, 10.000000,1.000000,1.414214, 5.000000,5.830952,6.403124, 5.656854,6.403124,7.071068), nrow=10, byrow=TRUE), # 第2个minDist矩阵 matrix(c(10.000000,10.049876,9.055385, 10.049876,10.000000,9.000000, 9.000000,9.055385,8.062258, 9.055385,9.000000,8.000000, 1.000000,1.414214,1.000000, 1.414214,1.000000,0.000000, 0.000000,1.000000,1.414214, 1.000000,0.000000,1.000000, 7.211103,6.708204,5.830952, 7.810250,7.211103,6.403124), nrow=10, byrow=TRUE), # 第3个minDist矩阵 matrix(c(0.000000,1.000000,9.055385, 1.000000,1.414214,9.000000, 1.000000,0.000000,8.062258, 1.414214,1.000000,8.000000, 9.000000,8.000000,1.000000, 9.055385,8.062258,0.000000, 10.000000,9.000000,1.414214, 10.049876,9.055385,1.000000, 5.656854,5.000000,5.830952, 6.403124,5.830952,6.403124), nrow=10, byrow=TRUE) )
方法1:用lapply批量处理(R风格推荐)
lapply可以直接遍历列表中的每个矩阵,对每个矩阵执行你已有的分组逻辑,代码简洁高效:
# 批量生成所有分组结果 all_groupings <- lapply(minDist_list, function(x) apply(x, 1, which.min)) # 查看第1个列表的分组结果(和你给出的示例一致) all_groupings[[1]] # 输出:[1] 1 1 1 1 3 2 3 2 1 1
方法2:用for循环处理(直观易懂)
如果你更习惯传统循环写法,可以先初始化空列表存储结果,再逐个处理:
# 初始化空列表用于存储结果 all_groupings <- list() # 循环处理每个minDist矩阵 for(i in seq_along(minDist_list)){ all_groupings[[i]] <- apply(minDist_list[[i]], 1, which.min) } # 查看第2个列表的分组结果 all_groupings[[2]]
两种方法最终都会得到一个包含3个向量的列表all_groupings,每个向量对应原minDist列表中对应矩阵的每行分组(最小值所在的列索引)。
内容的提问来源于stack exchange,提问作者DataMiningStudent
相关产品推荐
相关产品推荐

