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

如何扩展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)

关键逻辑说明

  1. 累计占比计算:对每组粒子数求和后,用cumsum计算累计值,再转换为占总粒子数的百分比。
  2. 定位目标粒径:用which(cumulative_pct >= 50)[1]找到第一个累计占比达到或超过50%的位置,取对应粒径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:32:28