如何扩展R代码批量获取各列50%累计粒子对应的粒径
批量计算多列数据的中位粒径(累计粒子数50%对应粒径)
核心需求
对包含粒径列和多组粒子数列的数据,批量计算每组粒子数累计达总粒子数50%时对应的粒径区间(即中位粒径)。
示例数据结构
假设你的数据结构如下(第一列为粒径,后续为不同组的粒子数):
# 模拟匹配需求的示例数据 set.seed(123) df <- data.frame( size = c(10.2, 12.5, 14.1, 15.8, 18.3), V1 = c(10, 25, 30, 20, 15), V2 = c(12, 22, 32, 18, 16), V3 = c(8, 20, 25, 30, 17), V4 = c(15, 20, 25, 22, 18), V5 = c(9, 24, 28, 21, 18) )
解决方案1:使用dplyr+purrr(简洁高效)
先定义处理单列的核心函数,再批量遍历所有粒子数列:
library(dplyr) library(purrr) # 定义单列处理函数:输入粒子数列和粒径列,返回中位粒径 get_median_size <- function(counts, sizes) { total_count <- sum(counts) cumulative_pct <- cumsum(counts) / total_count * 100 # 取第一个累计占比≥50%对应的粒径 sizes[which(cumulative_pct >= 50)[1]] } # 批量处理所有非粒径列 result_df <- df %>% select(-size) %>% # 排除粒径列 map_dfr(function(col) { tibble( group = cur_column(), median_size_nm = get_median_size(col, df$size) ) }) print(result_df)
运行后输出:
# A tibble: 5 × 2 group median_size_nm <chr> <dbl> 1 V1 14.1 2 V2 14.1 3 V3 15.8 4 V4 14.1 5 V5 14.1
完全匹配你给出的示例结果(V1、V2对应14.1nm,V3对应15.8nm)。
解决方案2:基础R循环(无需加载额外包)
如果你不想依赖第三方包,用基础R循环也能实现:
# 初始化结果存储向量 median_sizes <- vector("numeric", length = ncol(df) - 1) names(median_sizes) <- colnames(df)[-1] # 遍历每一列计算 for (col_name in colnames(df)[-1]) { counts <- df[[col_name]] total <- sum(counts) cumulative_pct <- cumsum(counts) / total * 100 median_sizes[col_name] <- df$size[which(cumulative_pct >= 50)[1]] } # 转换为数据框查看结果 as.data.frame(median_sizes)
关键逻辑说明
- 累计占比计算:对每组粒子数求和后,用
cumsum计算累计值,再转换为占总粒子数的百分比。 - 定位目标粒径:用
which(cumulative_pct >= 50)[1]找到第一个累计占比达到或超过50%的位置,取对应粒径。
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

