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

