子集中两组之间的最短欧氏距离

时间:2014-07-16 12:12:09

标签: r plyr

我有一个较大的数据框(50000点),表示从生物图像中收集的2D点。点被分类为红色或绿色,并且在组中相互关联(在示例中:单元格A-D)。可以找到一个小的测试数据集(MSR_test.csv)here

require(ggplot2)
cells <- read.csv("MSR_test.csv")
ggplot(cells, aes(X, Y, colour = channel, shape = cell)) + 
   geom_point() +
   scale_colour_manual(values = c("green","red"), name = "channel")

我试图找到一种相当直接的方式(可能涉及plyr?)来找到每个绿点与同一“细胞组”内最近的红点之间的欧几里德距离。虽然我认为我已经研究了如何为单个分组(使用包rdist中的fields)执行此操作,但我似乎无法确定如何将方法应用于我的数据框。

1 个答案:

答案 0 :(得分:1)

我认为没有理由使用plyr,但也许我错了。 以下代码适用于您的示例。我没有使用任何重函数来计算欧氏距离,主要是因为你可能需要在很多点上计算它。

green <- subset(cells, channel=="Green")
red <- subset(cells, channel=="Red")
fun_dist <- function(a, M) rowSums( (M - matrix(1,nrow(M),1) %*% as.numeric(a))**2 )
foo <- function(greenrow, matred) {
  subred <- subset(matred, cell == greenrow["cell"], select=c("X","Y"))
  minred <- subred[ which.min(fun_dist(unlist(greenrow[c("X","Y")]),subred)), ]
  return(minred)
}
data.frame( "rbind", apply(green, 1, foo, red) )