如何使用行中的值向 Dataframe 添加新列?

nhjlsmyf  于 2023-02-01  发布在  其他
关注(0)|答案(2)|浏览(98)

我在计算和的多项式分布。把它想象成选举:假设有11名选民和3名候选人,候选人A被选中的概率为0.5,B为0.3,C为0.2,我感兴趣的是计算A获胜的概率。
所以我考虑了A在多数票下获胜的所有可能情况(得票最多的选项获胜),计算它们发生的概率,然后将所有这些值相加。
当我试图计算A获胜的每一个场景的多项分布时,我的问题就来了。
我有一个数据框,里面有A获胜的所有可能结果,理想情况下,我需要一个新的列,其中显示每种结果发生的概率,类似于这样:

V1 V2 V3 dmultinom(x = c(5, 3, 3), prob = options)
1   5  2  4                                   0.06237
2   5  3  3                                   0.06237
3   5  4  2                                   0.06237
4   6  0  5                                   0.06237
5   6  1  4                                   0.06237
6   6  2  3                                   0.06237
7   6  3  2                                   0.06237
8   6  4  1                                   0.06237
9   6  5  0                                   0.06237
10  7  0  4                                   0.06237
11  7  1  3                                   0.06237
12  7  2  2                                   0.06237
13  7  3  1                                   0.06237
14  7  4  0                                   0.06237
15  8  0  3                                   0.06237
16  8  1  2                                   0.06237
17  8  2  1                                   0.06237
18  8  3  0                                   0.06237
19  9  0  2                                   0.06237
20  9  1  1                                   0.06237
21  9  2  0                                   0.06237
22 10  0  1                                   0.06237
23 10  1  0                                   0.06237
24 11  0  0                                   0.06237

当然,要有正确的价值观。
我尝试使用$访问行的值,但没有成功,我还尝试使用dsplyr创建一个新列,将行的值作为向量,但也没有成功。

nwnhqdif

nwnhqdif1#

下面是data.table的一个选项

library(data.table)

#create data.frame
xx <- data.frame(V1 = c(5, 5, 5, 6),
                 V2 = c(2, 3, 4, 0),
                 V3 = c(4, 3, 2, 5))

#convert the data.frame to a data.table
setDT(xx)

#put the data in long format
xx <- data.table::melt(xx,
                       measure.vars = names(xx))

#make a grouping variable
xx[, group := rep(1:4, 3)]

#apply function to each group
xx[, probability := dmultinom(value, prob = c(0.5, 0.3, 0.2)), by = "group"]

#pivot data back to wider format
yy <- data.table::dcast(xx[, !c("group")],
                        probability ~ variable,
                        value.var = "value")
> yy

   probability V1 V2 V3
1:  0.00231000  6  0  5
2:  0.03118500  5  2  4
3:  0.06237000  5  3  3
4:  0.07016625  5  4  2
eeq64g8w

eeq64g8w2#

这不是最好的解决方案,但可以用一个for循环来完成。
首先,创建空列:

dat$multinom <- 0

接下来,迭代 Dataframe ,将多项式与来自V1、V2和V3的输入相加

for (i in 1:nrow(dat)) {
  dat$multinom[i] <- dmultinom(x = c(dat$V1[i], dat$V2[i], dat$V3[i]), prob = options)
}

相关问题