是否有R函数可将QuPath样本Tile按基质占比分组至离散百分比区间?
高效划分基质占比区间并统计Tile数量(R实现)
方法1:使用cut()函数(最简洁高效)
cut()是R中专门为连续变量分箱设计的函数,完全适配你的需求,比嵌套ifelse简洁且性能更优。
操作步骤:
- 清理数据格式:如果你的
Percent Stroma列带%符号,先转换为数值型:
# 假设数据框名为tile_data tile_data$percent_stroma <- as.numeric(sub("%", "", tile_data$`Percent Stroma`))
- 划分区间:
# 定义区间边界(0到100,步长10) breaks <- seq(0, 100, by = 10) # 生成区间标签(如"0-10"、"10-20") labels <- paste(breaks[-length(breaks)], breaks[-1], sep = "-") # 添加区间列到数据框 tile_data$stroma_bin <- cut( tile_data$percent_stroma, breaks = breaks, labels = labels, include.lowest = TRUE # 确保0%的Tile被归入第一个区间 )
- 若存在超过100%的异常值,可将
breaks调整为seq(0, 110, by = 10),或用right = FALSE修改区间闭合方向。
- 统计区间数量:
# 快速统计各区间Tile数 bin_counts <- table(tile_data$stroma_bin) # 转换为易读的数据框格式 bin_counts_df <- as.data.frame(bin_counts) colnames(bin_counts_df) <- c("Stroma Percentage Range", "Tile Count")
方法2:使用dplyr包(适配tidyverse工作流)
如果你习惯用管道式操作,dplyr的组合写法更流畅:
管道版cut()实现:
library(dplyr) tile_data_processed <- tile_data %>% mutate( percent_stroma = as.numeric(sub("%", "", `Percent Stroma`)), stroma_bin = cut( percent_stroma, breaks = seq(0, 100, by = 10), labels = paste(seq(0, 90, 10), seq(10, 100, 10), sep = "-"), include.lowest = TRUE ) ) %>% count(stroma_bin, name = "Tile Count") %>% rename(`Stroma Percentage Range` = stroma_bin)
用case_when()替代嵌套ifelse(更易读):
如果需要更灵活的区间定义,case_when()比多层ifelse结构清晰:
tile_data_processed <- tile_data %>% mutate( percent_stroma = as.numeric(sub("%", "", `Percent Stroma`)), stroma_bin = case_when( percent_stroma >= 0 & percent_stroma <= 10 ~ "0-10", percent_stroma > 10 & percent_stroma <= 20 ~ "10-20", percent_stroma > 20 & percent_stroma <= 30 ~ "20-30", percent_stroma > 30 & percent_stroma <= 40 ~ "30-40", percent_stroma > 40 & percent_stroma <= 50 ~ "40-50", percent_stroma > 50 & percent_stroma <= 60 ~ "50-60", percent_stroma > 60 & percent_stroma <= 70 ~ "60-70", percent_stroma > 70 & percent_stroma <= 80 ~ "70-80", percent_stroma > 80 & percent_stroma <= 90 ~ "80-90", percent_stroma > 90 & percent_stroma <= 100 ~ "90-100", TRUE ~ "Out of Range" # 处理超出0-100的异常值 ) ) %>% count(stroma_bin, name = "Tile Count")
结果示例
最终统计结果会呈现为类似如下的格式:
| Stroma Percentage Range | Tile Count |
|---|---|
| 0-10 | 2 |
| 10-20 | 1 |
| 40-50 | 2 |
| 50-60 | 1 |
| 60-70 | 1 |
优势说明
cut()是R底层优化的函数,处理大规模数据时速度远快于嵌套ifelse- 代码可维护性强:调整区间只需修改
breaks参数,无需修改大量条件判断 - 自动生成规范的区间标签,避免手动拼写错误
内容的提问来源于stack exchange,提问作者fgootkind
相关产品推荐
相关产品推荐

