You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言如何统计落在Nucleus边界框范围内的Droplet点数量

实现方法

方法1:基于bbox边界框判断(最简单,匹配需求)

直接判断质心是否落在边界框范围内的方法实现最简单,数千级别的数据量下运行效率也很高,两种常用实现方式如下:

tidyverse版本

# 加载依赖包
library(dplyr)
library(purrr)

# 统计每个细胞核内的Droplet数量
result <- Nucleus %>%
  mutate(Droplets_count = pmap_int(
    list(bbox_x_start, bbox_x_end, bbox_y_start, bbox_y_end),
    function(xmin, xmax, ymin, ymax) {
      sum(
        Droplets$centroid_x >= xmin & Droplets$centroid_x <= xmax &
        Droplets$centroid_y >= ymin & Droplets$centroid_y <= ymax
      )
    }
  )) %>%
  select(class_name, object_id, Droplets_count)

Base R版本

不需要额外安装第三方包:

Nucleus$Droplets_count <- sapply(1:nrow(Nucleus), function(i) {
  sum(
    Droplets$centroid_x >= Nucleus$bbox_x_start[i] & 
    Droplets$centroid_x <= Nucleus$bbox_x_end[i] &
    Droplets$centroid_y >= Nucleus$bbox_y_start[i] & 
    Droplets$centroid_y <= Nucleus$bbox_y_end[i]
  )
})
result <- Nucleus[, c("class_name", "object_id", "Droplets_count")]

方法2:基于多边形精确判断(适用于细胞核为非规则矩形的场景)

如果需要判断点是否落在细胞核的实际轮廓范围内,可以用sp包的point.in.polygon方法:

library(sp)
library(dplyr)
library(purrr)

# 注:poly_list为每个细胞核对应的轮廓坐标列表,索引与Nucleus的行顺序一一对应
result <- Nucleus %>%
  mutate(Droplets_count = map_int(1:nrow(Nucleus), function(idx) {
    poly_coords <- poly_list[[idx]]
    sum(point.in.polygon(
      Droplets$centroid_x, Droplets$centroid_y,
      poly_coords$x, poly_coords$y
    ) > 0)
  })) %>%
  select(class_name, object_id, Droplets_count)

内容的提问来源于stack exchange,提问作者Cassio Fleming

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:09:02