2016-08-01 4 views
-1

Я пытаюсь определить расстояние между каждой точкой в ​​одном наборе данных и другим набором данных в R. Каждый набор данных имеет параметры X и Y. Я преобразовывал наборы данных в кадры данных и находил расстояние. Однако мой текущий код создает большую матрицу из-за этого перечисления как наборов данных в виде столбцов, так и строк. Затем мне нужно определить определенную часть матрицы, на которую я хочу получить ответы, есть ли способ просто поставить DSA в качестве столбцов и DSB в качестве строк. это whould вырезать матрицу в 1/4, который, так как мои наборы данных содержат тысячи точек каждый whould действительно сократить время для algorithum запуститьДистанционная матрица

Вот код, я использую

tumor<-data.frame(DSA[,c ("X_Parameter","Y_Parameter")]) 
cells<-data.frame(DSB[,c ("X_Parameter","Y_Parameter")]) 
distances<-as.matrix(dist(rbind(tumor,cells))) 
row.start<-nrow(tumor)+1 
row.end<-nrow(tumor)+nrow(cells) 
col.start<-1 
col.end<-nrow(tumor) 
distances[row.start:row.end, col.start:col.end] 
d<- distances[row.start:row.end, col.start:col.end] 
+2

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

ответ

0

Попробуйте flexclust::dist2 :

n_tumor = 2000 
n_cells = 2000 
tumor = matrix(runif(n_tumor * 2), n_tumor,) 
cells = matrix(runif(n_cells * 2), n_cells,) 

t_dist = system.time({ 
    distances<-as.matrix(dist(rbind(tumor,cells))) 
    row.start<-nrow(tumor)+1 
    row.end<-nrow(tumor)+nrow(cells) 
    col.start<-1 
    col.end<-nrow(tumor) 
    d <- distances[row.start:row.end, col.start:col.end] 
})[3] 

require(flexclust) 
t_dist2 = system.time({d2 = dist2(x = cells, y = tumor, method = "euclidean")})[3] 

t_dist # 1.477 
t_dist2 # 0.244 
identical(unname(d), d2) # TRUE 

EDIT: Другой альтернативой является proxy::dist.

0

Это будет вычислять только часть матрицы вам нужно:

tumoridx <- rep(1:nrow(tumor), each=nrow(cells) 
cellsidx <- rep(1:nrow(cells), nrow(tumor)) 
tcdist <- matrix(sqrt(rowSums((tumor[tumoridx, ] - cells[cellsidx, ])^2)), 
    nrow(cells), nrow(tumor))