Как рассчитать расстояние между рядами нескольких точек в таблице данных, используя R? - PullRequest
0 голосов
/ 03 июня 2019

Я хочу вычислить расстояние между несколькими строками в серии, используя R. Имеется таблица данных 967 X 35.Массив таблицы выглядит следующим образом.

1. 6.23  3.3   4.36  3.9    ----  4.50   1.50  3.35   (35 column)
2. 5.00  2.3   3.36  4.39   ----  2.52   3.40  2.37   (35 column)
3. 5.23  2.6   5.64  4.23   ----  3.50   4.55  3.48   (35 column)

Что если я хочу вычислить расстояние между каждой ячейкой каждой строки?Например, скажем, я хочу вычислить расстояние между строкой 1 и строкой 2 / между строкой 2 и строкой 3 и т. Д.

Тогда математическая формула для расчета расстояния будет ... Квадратный корень из {(6.23-5)^2 +(3.3-2.3)^2+(4.36-3.36)^2+(3.9-4.39)^2+------- + (4.5-2.52)^2+(1.5-3.4)^2+(3.35-2.37)^2} и будет выполнять те же вычисления для всех двух других строк (1-2 строки, 2-3 строки, 3-4 строки,… .., 967-1 ряд (967 раз))

Но я незнаю, как закодировать эту методологию в R.

Я загрузил таблицу данных.(Называется "R_skills")

Затем, используя R, я закодировал, как показано ниже.

  1. 'Read.xlsx (R_skills)' 2. sample.matrix<-matrix(c(1:33635,ncol=35)
  2. paralleldist(x=sample.mtarix,method="dtw")

Ошибка: неожиданный символ в: "sample.matrix <-matrix (c (1: 33635, ncol = 35) параллелдист" </p>

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

Это должно сделать это для вас:

sapply(1:(nrow(dt)-1),function(t,dt){dist(dt[t:(t+1),])},dt)
0 голосов
/ 04 июня 2019

@ tushaR правильно понял для базы R.:)

mat <- sample.matrix <- matrix(1:33635,ncol=35)

dist_fun <- function(x, y) sqrt(sum(x-y)**2)

s_fun <- function(t){
        sapply(t, function(x) dist_fun(mat[x,], mat[x+1]) )
}
m_fun <- function(t){
        mapply(function(x) dist_fun(mat[x,], mat[x+1]), t)
}
a_fun <- function(t){
        apply(matrix(t, nrow = 1), 2, function(x) dist_fun(mat[x,], mat[x+1]) )
}
l_fun <- function(t){
        unlist( lapply(as.list(t, nrow = 1), function(x) dist_fun(mat[x,], mat[x+1]) ) )
}

# t <- 1:(nrow(mat)-1)
# s_fun( 1:(nrow(mat)-1) )

library(microbenchmark)
n <- 1e5 # 961
mat <- sample.matrix <- matrix(1:(35*n),ncol=35)

microbenchmark("sapply" = s_fun(1:(nrow(mat)-1)),
               "mapply" = m_fun(1:(nrow(mat)-1)),
               "apply" = a_fun(1:(nrow(mat)-1)),
               "lapply" = l_fun(1:(nrow(mat)-1)),
               list = NULL, times = 100L, unit = "ms", check = NULL,
               control = list(), setup = NULL)
#> Unit: milliseconds
#>    expr      min       lq     mean   median       uq      max neval
#>  sapply 315.5892 413.6667 534.0462 498.0186 600.1315 1096.092   100
#>  mapply 313.7013 441.9728 534.9250 505.3026 577.5770 1167.973   100
#>   apply 387.1655 503.9833 615.6288 563.4751 665.4584 1571.387   100
#>  lapply 309.3762 416.0796 553.0482 491.5356 645.2026 1823.269   100

Создано в 2019-06-04 пакетом Представ (v0.2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...