【问题标题】:How to recover data points after applying which.min function in r在 r 中应用 which.min 函数后如何恢复数据点
【发布时间】:2018-01-07 10:59:58
【问题描述】:

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

矩阵 A:

     [,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:

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

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

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

        [,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

获得所有距离后,我将其存储在一个距离矩阵中:

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 个组。例如,如果我得到以下组,如何恢复来自矩阵 A 的数据点?

    > groupings <- apply(distanceMatrix, 1, which.min)
    > [1] 1 1 1 1 3 2 3 2 1 1 

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

【问题讨论】:

  • 您的解释很清楚,直到您真正提出问题。你期望的输出是什么?
  • 是的,应该是一样的。但是,如果我将所有第 1 组、第 2 组和第 3 组组合在一起,矩阵 A 中数据点的位置也会发生变化,那么如果顺序已更改,我如何知道矩阵 A 的确切数据点。跨度>
  • 也许您可以使用names(groupings) &lt;- seq(1, length(groupings)) 以便名称表示矩阵A中的行号

标签: r matrix grouping


【解决方案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

【讨论】:

  • 非常感谢这两个选项都有帮助
猜你喜欢
  • 2017-07-26
  • 2021-04-17
  • 1970-01-01
  • 2021-03-10
  • 2016-07-10
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 2017-01-01
相关资源
最近更新 更多