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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:21:00