我试图确定一个数据集中每个点与R中其他数据集之间的距离。每个数据集都有一个X和Y参数。我一直在将数据集转换为数据框并找到距离。但是,我当前的代码会创建一个大矩阵,因为这会将数据集列为列和行。然后我需要确定我关心的矩阵的特定部分以获得我的答案。有没有办法将DSA作为列,DSB作为行。这可以在1/4中切割矩阵,因为我的数据集包含数千个点,每个点都可以减少算法运行的时间
以下是我正在使用的代码
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]
答案 0 :(得分: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
修改强>
另一种选择是proxy::dist
。
答案 1 :(得分: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))