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

R语言按数据框指定列分组后对另一列应用自定义函数计算切点

R按分组计算指定概率阈值的实现方法

以下是两种常用的实现方案:

方案1:tidyverse生态实现(代码更易读)

# 加载依赖包,未安装先运行 install.packages(c("dplyr","tidyr"))
library(dplyr)
library(tidyr)

# 构建示例数据
df <- data.frame(
  Time = rep(c(1,2,3), c(4,2,2)),
  Value = c(1,0.25,1,0.5,2,2,2,2)
)

# 预设参数
probs <- c(0.75, 0.99)
sel <- probs < 1

# 分组计算+转宽表
df %>%
  group_by(Time) %>%
  summarise(
    calc_val = list(10^qnorm(probs[sel], mean(Value), sd(Value))),
    prob_label = list(as.character(probs[sel]))
  ) %>%
  unnest(c(calc_val, prob_label)) %>%
  pivot_wider(names_from = prob_label, values_from = calc_val)

注意:如果分组内所有Value值完全相同(如示例数据中Time=2、3的Value均为2),标准差为0,qnorm会返回Inf,可根据业务需求提前对这类场景做特殊值替换。

方案2:基础R实现(无需额外安装依赖)

# 预设参数
probs <- c(0.75, 0.99)
sel <- probs < 1

# 分组计算
group_res <- lapply(split(df, df$Time), function(group_df) {
  m <- mean(group_df$Value)
  s <- sd(group_df$Value)
  res_vals <- 10^qnorm(probs[sel], m, s)
  data.frame(Time = group_df$Time[1], t(res_vals))
})

# 合并结果+修改列名
final_res <- do.call(rbind, group_res)
colnames(final_res) <- c("Time", as.character(probs[sel]))
rownames(final_res) <- NULL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:24:04