R在没有低效循环的情况下乘以单元格

时间:2016-01-18 15:26:40

标签: r loops

我有以下数据集结构,其中每个条目是该团队得分的概率很多点(例如,在第一场比赛中得分1分的球队概率为0.1)。

library(data.table)

x = data.table(matrix(c('game_1', 'team_a', 0.1, 0.2, 0.6, 0.1, 'game_1', 'team_b', 0.2, 0.3, 0.4, 0.1,
                        'game_2', 'team_a', 0.2, 0.1, 0.5, 0.2, 'game_2', 'team_b', 0.3, 0.2, 0.3, 0.2), ncol=6, byrow=T))
names(x) = c('game_number', 'team', 'point_1', 'point_2', 'point_3', 'point_4')

x

#    game_number   team point_1 point_2 point_3 point_4
# 1:      game_1 team_a     0.1     0.2     0.6     0.1
# 2:      game_1 team_b     0.2     0.3     0.4     0.1
# 3:      game_2 team_a     0.2     0.1     0.5     0.2
# 4:      game_2 team_b     0.3     0.2     0.3     0.2

我想知道每支球队赢得每场比赛的概率(以及每场比赛抽签的概率)。有没有办法在没有大而低效的循环的情况下做到这一点?

例如球队获胜的概率1:

= 0.1*0.4 + 0.1*0.3 + 0.1*0.2 + 0.6*0.3 + 0.6*0.2 + 0.2*0.2

1 个答案:

答案 0 :(得分:0)

我不知道这样做的好功能,但这就是我将如何解决它。请注意,我只使用概率数据。此外,此脚本应适用于任意数量的匹配和任意数量的点。

library(data.table)
x = data.table(matrix(c('game_1', 'team_a', 0.1, 0.2, 0.6, 0.1, 'game_1', 'team_b', 0.2, 0.3, 0.4, 0.1,
                        'game_2', 'team_a', 0.2, 0.1, 0.5, 0.2, 'game_2', 'team_b', 0.3, 0.2, 0.3, 0.2), ncol=6, byrow=T))
names(x) = c('game_number', 'team', 'point_1', 'point_2', 'point_3', 'point_4')

x[, point_1 := as.numeric(point_1)]
x[, point_2 := as.numeric(point_2)]
x[, point_3 := as.numeric(point_3)]
x[, point_4 := as.numeric(point_4)]

x2 <- x
x2[, c('game_number','team') := NULL]

首先,我们必须计算累积概率

# Calculate the cumulative probability
y <- t(apply(x2,1,cumsum))

从那时起,我们希望将累积概率乘以其他团队的相应得分概率。

# Remove the 1 probability column in the end
y <- y[, -ncol(y)]

# Swap every odd with every subsequent even row
even <- seq(2, nrow(y), by=2)
sequence <- c(rbind(even,even-1))
y <- y[sequence,]

# Multiply the two vectors with each other
x2[, point_1 := NULL]
z <- x2 * y

最后,我们更新x以包含一个列prob,其中包含该团队赢得该匹配的概率。

# Find the probability of winning
x[, prob := rowSums(z)]