使用mutate和group_by调用需向量的自定义函数处理分组数据框特定列
使用dplyr的group_by + mutate结合自定义函数处理分组数据
看起来你已经有了分组的示例数据和自定义的power.sequential函数,核心需求是按group列拆分数据后,把期望向量nseq、pseq传给函数,再把结果整合回原数据框对吧?我来帮你梳理具体的实现方式:
首先先把你的示例代码整理清晰:
# 示例数据 my_data <- data.frame( N = c(12, 12, 24, 24, 12, 12), p = rep(c(.125,.125,.025), 2), group = rep(c("dogs","cats"), each=3) ) # 你的自定义函数(原代码未完成,这里保留现有结构) power.sequential <- function(d, nseq, pseq){ decvec <- NULL nvec <- NULL for (i in 1:100){ decvec[i] <- 0 nvec[i] <- 0 j <- 1 x <- NULL while(decvec[i] == 0 & nvec[i] < sum(nseq)){ x <- c(x, rnorm(nseq[j], mean = ...)) # 这里需要补充完整的均值逻辑 # 此处应该添加判断decvec[i]是否更新的逻辑 j <- j + 1 } # 函数需要返回最终计算结果,比如模拟的power值或统计量 } # 返回处理后的结果(建议返回数据框或向量,方便和原数据整合) }
核心实现方案
我们可以用dplyr的分组工具,结合cur_data()获取当前分组的子数据框,把它和期望向量一起传给自定义函数:
情况1:函数返回每组的单个汇总值
如果你的函数最终输出每组的一个统计结果(比如分组的power值),可以这样写:
library(dplyr) # 先补全函数的简单示例(方便演示) power.sequential <- function(d, nseq, pseq){ # 这里用加权和模拟你的计算逻辑,实际替换成你的完整代码 group_power <- sum(d$N * d$p) * mean(nseq) return(data.frame(power = group_power)) } # 分组应用函数,新增结果列 processed_data <- my_data %>% group_by(group) %>% mutate(group_power = power.sequential(cur_data(), nseq = c(12,24), pseq = c(0.125, 0.025))$power) %>% ungroup() print(processed_data)
情况2:函数返回每行的计算结果
如果需要对分组内的每一行单独处理,结合purrr的pmap系列函数更方便:
library(dplyr) library(purrr) # 修改函数为处理单行数据的逻辑 power.sequential_row <- function(row, nseq, pseq){ # 针对单行计算,比如N乘以pseq的标准差 row_result <- row$N * sd(pseq) return(row_result) } # 分组后逐行应用函数 processed_row_data <- my_data %>% group_by(group) %>% mutate(row_result = pmap_dbl(., power.sequential_row, nseq = c(12,24), pseq = c(0.125, 0.025))) %>% ungroup() print(processed_row_data)
注意事项
cur_data()是dplyr里的实用函数,能在分组操作中获取当前组的子数据框,刚好匹配你的函数参数d- 确保自定义函数的返回值类型和
mutate预期一致:如果是单个值,会自动广播到整个分组;如果是向量,长度要和分组的行数匹配 - 你的原函数里有循环和模拟逻辑,建议最终返回明确的结果(比如数据框),这样和原数据整合时更不容易出错
内容的提问来源于stack exchange,提问作者Esther
相关产品推荐
相关产品推荐

