在r中应用which.min函数后如何恢复数据点

时间:2018-01-07 10:59:58

标签: r matrix grouping

我有两个矩阵,即矩阵A和矩阵B

矩阵A:

.project

矩阵B:

     [,1][,2]
[1,]   1   1   
[2,]   1   2   
[3,]   2   1   
[4,]   2   2   
[5,]   10  1   
[6,]   10  2   
[7,]   11  1   
[8,]   11  2   
[9,]   5   5   
[10,]  5   6   

对于矩阵A中的每一行,我计算矩阵B中每两列的欧氏距离。

例如,要在结果矩阵中获得以下答案:

     [,1][,2][,3][,4][,5][,6]
[1,]   2   1   5   5  10   1

计算结果如下:

        [,1]
    [1,] 

要在结果矩阵中得到以下答案:

    A(1,1) - From Matrix A
    B(2,1) - From Matrix B

    = sqrt((xA -xB)^2 + (yA -yB)^2)
    = sqrt((1-2)^2 + (1-1)^2)
    = 1.00

    xA and yA from Matrix A
    xB and yB from Matrix B

计算结果如下:

        [,2]
    [1,] 5.66

要在结果矩阵中得到以下答案:

    A(1,1) - From Matrix A
    B(5,5) - From Matrix B

    = sqrt((xA -xB)^2 + (yA -yB)^2)
    = sqrt((1-5)^2 + (1-5)^2)
    = 5.66

计算结果如下:

        [,3]
    [1,] 9.00

在我拥有所有距离之后,我将它存储在距离矩阵中,如下所示:

    A(1,1) - From Matrix A
    B(10,1) - From Matrix B

    = sqrt((xA -xB)^2 + (yA -yB)^2)
    = sqrt((1-10)^2 + (1-1)^2)
    = 9.00

然后我根据每行的最小距离进行分组,以了解每行是否属于第1,2或3组。共有3组。例如,如果我得到以下组,如何恢复矩阵A的数据点?

Distance matrix (the answer for the euclidean distance):

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

    [1,] 1.00  5.66  9.00
    [2,] 1.00  1.41
    [3,]
    [4,]
    [5,]
    [7,]
    [8,]
    [9,]
    [10]

例如前四行属于组1,第五点属于组3,依此类推。但是如果我重新安排答案并将所有组1组合在一起,组2组合在一起组3组,则矩阵A的位置将发生变化。那么我怎样才能正确地从矩阵A中找回这一点呢?

1 个答案:

答案 0 :(得分:1)

我不确定您的预期输出是什么,但以下两个选项中的一个可能会有所帮助吗?

# sample data
A = as.matrix(read.table(text="1   1   
1   2   
2   1   
2   2   
10  1   
10  2   
11  1   
11  2   
5   5   
5   6 ",header=F))
B = c(2,   1,   5,   5,  10,   1)
B = matrix(B,3,byrow = T)

# compute minimum distance
distancematrix = t(apply(A, 1,function(y) {apply(B,1,function(x) {dist(rbind(x,y))})}))

# option 1
A_df = as.data.frame(A)
A_df$group = apply(distancematrix,1,which.min)
A_df[order(A_df$group),]

# option 2
split(as.data.frame(A),apply(distancematrix,1,which.min))

输出选项1:

   V1 V2 group
1   1  1     1
2   1  2     1
3   2  1     1
4   2  2     1
9   5  5     2
10  5  6     2
5  10  1     3
6  10  2     3
7  11  1     3
8  11  2     3

输出选项2:

$`1`
  V1 V2
1  1  1
2  1  2
3  2  1
4  2  2

$`2`
   V1 V2
9   5  5
10  5  6

$`3`
  V1 V2
5 10  1
6 10  2
7 11  1
8 11  2