【问题标题】:Shortest Euclidean distance between two groups in subset子集中两组之间的最短欧几里得距离
【发布时间】:2014-07-16 12:12:08
【问题描述】:

我有一个较大的数据框(50000 个点),表示从生物图像中收集的二维点。点被分类为红色或绿色,并在组中相互关联(在示例中:单元格 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?)来找到同一“细胞组”内每个绿点与其最近的红点之间的欧几里得距离。虽然我认为我已经弄清楚了如何为单个分组执行此操作(使用包 fields 中的 rdist),但我似乎无法弄清楚如何将方法应用于我的数据框。

【问题讨论】:

  • 也许使用apply 函数来提取各种分组子集并依次运行rdist,存储所需的距离?

标签: r plyr


【解决方案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) )

【讨论】:

    猜你喜欢
    • 2013-02-12
    • 2021-01-08
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2011-01-29
    • 2023-03-25
    • 2019-06-19
    相关资源
    最近更新 更多