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
相关产品推荐
相关产品推荐

