如何用apply/mapply替代循环在R数据框行调用ppoibin函数?
解决R语言中逐行调用ppoibin函数的向量化方法
要避免循环,用mapply或者purrr::pmap就能实现逐行匹配参数调用ppoibin,以下是具体实现:
方法1:使用基础包的mapply
mapply可以对多组输入逐元素配对应用函数,刚好适配你的场景——把每行的k值和对应的概率向量一一传入ppoibin:
library(poibin) # 构造原始数据 p <- matrix(c(0.046, 0.046, 0.323, 0.122, 0.122, 0.490, 0.122, 0.122, 0.490), 3 , 3, byrow = TRUE) dat <- data.frame(k = c(0, 1, 0)) dat$p <- p # 用mapply替代循环 dat$prob_mapply <- mapply(ppoibin, k = dat$k, pp = split(dat$p, seq(nrow(dat$p))))
这里split(dat$p, seq(nrow(dat$p)))把概率矩阵按行拆分为列表,每个元素对应一行的概率向量,mapply会自动把dat$k的每个元素和列表的每个元素配对传入函数。
方法2:使用tidyverse的pmap
如果你习惯tidyverse风格,purrr::pmap也能实现同样效果,它专门处理多参数的逐行/逐元素调用:
library(purrr) library(poibin) # 构造数据同上 dat$prob_pmap <- pmap(list(k = dat$k, pp = split(dat$p, seq(nrow(dat$p)))), ppoibin) # 将列表结果转为向量(pmap默认返回列表) dat$prob_pmap <- unlist(dat$prob_pmap)
为什么直接调用ppoibin会出错?
ppoibin的第二个参数要求是单个概率向量,你直接传入整个矩阵dat$p[,]时,函数无法自动按行匹配对应的k值,因此返回错误结果。
验证结果一致性
运行以下代码可以确认向量化方法和循环结果完全一致:
# 先运行你原来的循环得到基准结果 for (i in c(1:nrow(dat))) { dat$prob[i] <- ppoibin(dat$k[i], dat$p[i,]) } # 验证匹配 all.equal(dat$prob, dat$prob_mapply) all.equal(dat$prob, dat$prob_pmap)
内容的提问来源于stack exchange,提问作者Zachary
相关产品推荐
相关产品推荐

