如何使用which.min函数列表

时间:2018-01-14 08:55:11

标签: r

我有3组名为minDist的列表。每个列表有三列,因此它有三个组(1,2和3)。

minDist:

 [[1]]
          [,1]     [,2]     [,3]
 [1,]  1.000000 9.055385 9.000000
 [2,]  0.000000 9.000000 9.055385
 [3,]  1.414214 8.062258 8.000000
 [4,]  1.000000 8.000000 8.062258
 [5,]  9.055385 1.000000 0.000000
 [6,]  9.000000 0.000000 1.000000
 [7,] 10.049876 1.414214 1.000000
 [8,] 10.000000 1.000000 1.414214
 [9,]  5.000000 5.830952 6.403124
[10,]  5.656854 6.403124 7.071068


[[2]]
        [,1]      [,2]     [,3]
[1,] 10.000000 10.049876 9.055385
[2,] 10.049876 10.000000 9.000000
[3,]  9.000000  9.055385 8.062258
[4,]  9.055385  9.000000 8.000000
[5,]  1.000000  1.414214 1.000000
[6,]  1.414214  1.000000 0.000000
[7,]  0.000000  1.000000 1.414214
[8,]  1.000000  0.000000 1.000000
[9,]  7.211103  6.708204 5.830952
[10,]  7.810250  7.211103 6.403124


 [[3]]
         [,1]     [,2]     [,3]
 [1,]  0.000000 1.000000 9.055385
 [2,]  1.000000 1.414214 9.000000
 [3,]  1.000000 0.000000 8.062258
 [4,]  1.414214 1.000000 8.000000
 [5,]  9.000000 8.000000 1.000000
 [6,]  9.055385 8.062258 0.000000
 [7,] 10.000000 9.000000 1.414214
 [8,] 10.049876 9.055385 1.000000
 [9,]  5.656854 5.000000 5.830952
 [10,]  6.403124 5.830952 6.403124

我想知道哪一行属于同一组。例如,清单1:

 [1] 1 1 1 1 3 2 3 2 1 1

含义第1,2,3,4,9和10行属于第1组,第6行和第8行属于第2组第5行,第7行属于第3组。

如果我只有一个列表,这就是我尝试进行分组的方式:

 grouping <- apply(minDist, 1, which.min)

如何使用循环获取所有三个列表的答案?

2 个答案:

答案 0 :(得分:6)

尝试:

lapply(minDist, function(x) max.col(-x))

不要使用效率极低的apply(x,1,which.min);改为使用max.col,它为矩阵的每一行返回最大值的索引(如果你想要最小值,你只需要找到x的最大值)。

答案 1 :(得分:2)

我们可以使用lapply循环遍历list元素,然后执行apply

lapply(minDist, function(x) apply(x, 1, which.min))