Извлекать каждые два элемента в строке матрицы в последовательности r для вычисления евклидова расстояния

Как извлечь каждые два элемента в последовательности в матрицу и вернуть результат в виде матрицы, чтобы я мог указать ответ в формуле для расчета:

Например, у меня есть матрица из одной строки с 6 столбцами:

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

Я хочу извлечь столбец 1 и два в первой итерации, 3 и 4 во второй итерации и так далее. Результат должен быть в форме матрицы.

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

Мои оригинальные коды:

     data <- matrix(c(1,1,1,2,2,1,2,2,5,5,5,6,10,1,10,2,11,1,11,2), ncol = 2)

Центральная матрица:

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

     objCentroidDist <- function(data, centers) {
       resultMatrix <- matrix(NA, nrow=dim(data)[1], ncol=dim(centers)[1])
       for(i in 1:nrow(centers)) {
          resultMatrix [,i] <- sqrt(rowSums(t(t(data)-centers[i, ])^2))
       }
          resultMatrix 
     }

    objCentroidDist(data,centers)

Я хочу, чтобы матрица Result была такой, как указано ниже:

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

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

Меня интересует, как рассчитать расстояние между центрами данных, если размеры матрицы данных равны двум, а матрица центров равна шести. (для расчета расстояния от матрицы данных и каждых двух столбцов в матрице центров). Каждый ряд матрицы центров имеет три центра.

1 ответ

Решение

Может быть как то так?

m <- matrix(c(2,1,5,5,10,1), ncol = 6)

list.seq.pairs <- lapply(seq(1, ncol(m), 2), function(x) {
  m[,c(x, x+1)]
})

> list.seq.pairs
[[1]]
[1] 2 1

[[2]]
[1] 5 5

[[3]]
[1] 10  1

И, если вы хотите перебрать несколько строк в матрице, вы можете расширить вышеперечисленное следующим образом:

mm <- matrix(1:18, ncol = 6, byrow = TRUE)       

apply(mm, 1, function(x) {
  lapply(seq(1, length(x), 2), function(y) {
    x[c(y, y+1)]
  })
})

РЕДАКТИРОВАТЬ:

Я действительно не уверен, что именно вы ищете. Я думаю, если вы хотите, чтобы каждая строка была преобразована в матрицу 2 x 3:

mm <- matrix(1:18, ncol = 6, byrow = TRUE)       

list.mats <- lapply(1:nrow(mm), function(x){
  a = matrix(mm[x,], ncol = 2, byrow = TRUE)
})

> list.mats
[[1]]
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6

[[2]]
     [,1] [,2]
[1,]    7    8
[2,]    9   10
[3,]   11   12

[[3]]
     [,1] [,2]
[1,]   13   14
[2,]   15   16
[3,]   17   18

Однако, если вы хотите перейти к матрице результатов - я думаю, что, вероятно, проще всего делать любые вычисления, которые вам нужно сделать, когда вы работаете с каждой строкой:

results <- t(apply(mm, 1, function(x) {
  sapply(seq(1, length(x), 2), function(y) {
    val1 = x[y] # Get item one
    val2 = x[y+1] # Get item two
    val1 / val2 # Do your calculation here
  })
}))

> results
          [,1]   [,2]      [,3]
[1,] 0.5000000 0.7500 0.8333333
[2,] 0.8750000 0.9000 0.9166667
[3,] 0.9285714 0.9375 0.9444444

Тем не менее, я не понимаю, что вы пытаетесь сделать, поэтому это может не попасть в цель. Возможно, вам повезет больше, если вы зададите новый вопрос, в котором вы увидите пример ввода и фактический ожидаемый результат, который вам нужен, с фактическими ожидаемыми значениями.

Другие вопросы по тегам