2016-01-18 64 views
-2

我有以下數據集結構,其中每個條目是該團隊得分的概率,許多點(例如,團隊在遊戲1中得分爲1分的概率爲0.1)。R乘以細胞明智沒有低效循環

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 

我想知道每個團隊贏得每場比賽的概率(以及每場比賽中平局的概率)。有沒有辦法做到這一點沒有一個大的,低效的循環?

EG戰隊遊戲勝出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

+2

沒有按照您提供的數據集的「團隊勝利遊戲1的概率」計算示例。 – JasonAizkalns

回答

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)] 
+0

你可以一步完成所有':='作業。看看[HTML vignettes](https://github.com/Rdatatable/data.table/wiki/Getting-started)。 – Arun

+0

好的,謝謝! – Laterow