首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中应用which.min函数后如何恢复数据点

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

Stack Overflow用户
提问于 2018-01-07 18:59:58
回答 1查看 76关注 0票数 1

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

矩阵A:

代码语言:javascript
复制
     [,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   

矩阵B:

代码语言:javascript
复制
     [,1][,2][,3][,4][,5][,6]
[1,]   2   1   5   5  10   1

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

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

代码语言:javascript
复制
        [,1]
    [1,] 

计算结果是:

代码语言:javascript
复制
    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

要在结果矩阵中获得以下问题的答案:

代码语言:javascript
复制
        [,2]
    [1,] 5.66

计算结果是:

代码语言:javascript
复制
    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

要在结果矩阵中获得以下问题的答案:

代码语言:javascript
复制
        [,3]
    [1,] 9.00

计算结果是:

代码语言:javascript
复制
    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

在我得到所有的距离后,我将其存储在一个距离矩阵中,如每个bleow:

代码语言:javascript
复制
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,2或3。有3个组所有together.For示例如果我得到以下组,如何从矩阵A恢复数据点?

代码语言:javascript
复制
    > groupings <- apply(distanceMatrix, 1, which.min)
    > [1] 1 1 1 1 3 2 3 2 1 1 

例如,前四行属于组1,第五个点属于组3,依此类推。但如果我重新排列答案,并将所有组1分组在一起,将组2分组在一起,将组3分组在一起,矩阵A的位置将改变。那么,我如何才能从矩阵A中正确地取回点呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-07 19:34:25

我不太确定您的预期输出是什么,但也许以下两个选项中的一个可以帮助您?

代码语言:javascript
复制
# 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:

代码语言:javascript
复制
   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:

代码语言:javascript
复制
$`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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48136466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档