如何基于行值为DataFrame添加多项分布概率计算新列?
解决方法
核心公式
多项分布的单一场景概率计算公式为:
P(a, b, c) = (n! / (a! * b! * c!)) * p_A^a * p_B^b * p_C^c
其中n为总选民数(此处n=11),a、b、c分别是三位候选人的得票数,p_A、p_B、p_C对应各自的获选概率(0.5、0.3、0.2)。
代码实现
假设你的DataFrame列名为a_votes、b_votes、c_votes,以下两种方式均可完成概率列的添加:
方法1:dplyr + purrr 实现逐行计算
library(dplyr) library(purrr) # 定义多项分布概率计算函数 calc_multinom_prob <- function(a, b, c) { factorial(11) / (factorial(a) * factorial(b) * factorial(c)) * 0.5^a * 0.3^b * 0.2^c } # 为DataFrame新增概率列 your_df <- your_df %>% mutate(probability = pmap_dbl(list(a_votes, b_votes, c_votes), calc_multinom_prob))
方法2:Base R 原生实现
若不想加载额外包,可直接用apply函数:
# 定义计算函数 calc_multinom_prob <- function(row) { a <- row[1] b <- row[2] c <- row[3] factorial(11) / (factorial(a) * factorial(b) * factorial(c)) * 0.5^a * 0.3^b * 0.2^c } # 添加概率列 your_df$probability <- apply(your_df[, c("a_votes", "b_votes", "c_votes")], 1, calc_multinom_prob)
注意事项
- 确保每行的
a_votes + b_votes + c_votes等于11,否则计算结果无效。 - 若你的DataFrame列名不同,需替换代码中对应的列名。
最后求和即可得到A获胜的总概率:
total_win_prob <- sum(your_df$probability)
内容的提问来源于stack exchange,提问作者Pablo
相关产品推荐
相关产品推荐

