Introduktion
Med hjälp av R-programmering och PBN-filer beräknas IAF över en hel omgång, tre spelkvällar med två halvlekar i varje. Eftersom parsammansättningar varierar över omgångar så är beräkningarna gjorda per spelare.
Läs in PBN-filerna
knitr::opts_chunk$set(echo = TRUE, comment = "")
library(PBN)
dat <- list()
pat <- "~/Bridgesystem/PBN/Test/"
source(paste0(pat, "tot_pbn.R"))
dat[[1]] <- tot_pbn(paste0(pat, "2025-04-03a.pbn"))
dat[[2]] <- tot_pbn(paste0(pat, "2025-04-03b.pbn"))
dat[[3]] <- tot_pbn(paste0(pat, "2025-04-10a.pbn"))
dat[[4]] <- tot_pbn(paste0(pat, "2025-04-10b.pbn"))
dat[[5]] <- tot_pbn(paste0(pat, "2025-04-24a.pbn"))
dat[[6]] <- tot_pbn(paste0(pat, "2025-04-24b.pbn"))
Hitta alla spelares MID
id <- dat[[1]][, 1]
for (i in 2:6){
id <- c(id, dat[[i]][, 1])
}
Fyll resultattabell
Sex halvlekar H1, \(\ldots\) H6.
player <- unique(id)
n.p <- length(player)
n.r <- 6 ## Antal ronder (halvlekar)
res <- matrix(NA, n.p, n.r)
rownames(res) <- player
colnames(res) <- paste0("H", 1:n.r)
##
rad <- 0
for(pl in player){
##cat("Player ", pl, "\n")
rad <- rad + 1
for (H in 1:n.r){
if (pl %in% dat[[H]][, 1]){
rw <- which(pl == dat[[H]][, 1])
## cat("rw = ", rw, "\n")
res[rad, H] <- dat[[H]][rw, 2]
}
}
}
print(res)
H1 H2 H3 H4 H5 H6
202008 3.09 -0.37 1.29 3.15 -1.30 -0.53
86586 3.09 -0.37 NA NA -1.30 -0.53
15363 2.87 3.10 1.59 -1.25 0.44 3.26
13326 2.87 3.10 1.59 -1.25 NA NA
19673 2.40 -1.78 -1.59 1.37 -0.63 -3.26
38619 2.40 -1.78 -1.59 1.37 -0.63 -3.26
62721 1.37 -0.49 NA NA NA NA
85224 1.37 -0.49 NA NA NA NA
45698 1.16 0.37 1.06 0.89 NA NA
17630 1.16 0.37 1.06 0.89 -0.08 NA
55268 1.16 1.13 NA NA 0.08 0.93
36317 1.16 1.13 1.29 3.15 0.08 0.93
203648 1.09 -1.48 1.21 -2.46 NA NA
33386 1.09 -1.48 1.21 -2.46 2.78 0.53
10752 0.81 -2.36 0.77 -0.45 -4.39 -0.27
9714 0.81 -2.36 NA NA -4.39 -0.27
5401 0.76 1.50 1.11 0.00 0.44 3.26
84341 0.76 1.50 1.11 0.00 NA NA
30068 0.05 1.48 NA NA -0.77 -0.81
84354 0.05 1.48 -1.11 -0.39 -0.77 -0.81
5421 -0.05 -1.50 -1.11 -0.39 NA NA
6737 -0.05 -1.50 NA NA -1.40 -2.13
17450 -0.76 -1.48 -0.22 1.25 0.77 2.13
12039 -0.76 -1.48 -0.22 1.25 0.77 2.13
32414 -0.81 0.49 -0.77 0.13 -2.06 -0.05
13938 -0.81 0.49 -0.22 -1.20 -0.36 0.05
49619 -1.09 -1.13 NA NA NA NA
54501 -1.09 -1.13 -0.37 2.46 -0.08 NA
68246 -1.16 3.01 -1.29 -0.89 -2.33 -0.93
86422 -1.16 3.01 NA NA 2.33 -2.13
90727 -1.16 1.48 NA NA NA NA
68333 -1.16 1.48 NA NA NA NA
3736 -1.37 2.36 -1.59 1.18 2.06 1.07
6210 -1.37 2.36 -1.59 1.18 2.06 1.07
16956 -2.40 -3.10 -0.77 0.13 NA NA
89018 -2.40 -3.10 NA NA NA NA
15930 -2.87 1.78 1.42 0.00 0.63 -0.15
14818 -2.87 1.78 1.42 0.00 0.63 -0.15
203438 -3.09 -3.01 -1.06 -3.15 -2.78 NA
202011 -3.09 -3.01 -1.06 -3.15 NA NA
3191 NA NA 2.04 -0.13 0.77 1.58
82732 NA NA 2.04 -0.13 NA NA
11072 NA NA 1.59 1.20 4.39 -1.58
9553 NA NA 1.59 1.20 4.39 -1.58
5409 NA NA 0.77 -0.45 0.77 1.58
203445 NA NA 0.37 0.36 -2.78 NA
203441 NA NA 0.37 0.36 NA NA
18637 NA NA 0.22 0.39 -0.44 0.15
6676 NA NA 0.22 0.39 -0.44 0.15
15204 NA NA 0.22 -1.18 -0.77 0.27
12766 NA NA 0.22 -1.18 -0.77 0.27
12506 NA NA -0.22 -1.20 -0.36 0.05
200584 NA NA -0.37 2.46 1.30 2.13
200583 NA NA -1.21 -0.36 NA NA
200582 NA NA -1.21 -0.36 NA NA
36321 NA NA -1.29 -0.89 NA NA
93895 NA NA -1.42 -1.37 -1.40 -2.13
13087 NA NA -1.42 -1.37 NA NA
60863 NA NA -2.04 0.45 -2.06 -0.05
8406 NA NA -2.04 0.45 NA NA
27023 NA NA NA NA 2.78 0.53
13794 NA NA NA NA 2.33 -2.13
14040 NA NA NA NA 1.40 0.81
61733 NA NA NA NA 1.40 0.81
200585 NA NA NA NA 1.30 2.13
85226 NA NA NA NA 0.36 -1.07
92512 NA NA NA NA 0.36 -1.07
203439 NA NA NA NA -2.33 -0.93
Summera och sortera
res1 <- cbind(res, rep(NA, nrow(res)), rep(NA, nrow(res)))
colnames(res1) <- c(colnames(res), c("Spelade", "IAF"))
for (rad in 1:nrow(res1)){
spe <- sum(!is.na(res1[rad, ]))
medel <- mean(res1[rad, ], na.rm = TRUE)
res1[rad, n.r + 1] <- spe
res1[rad, n.r + 2] <- round(medel, 2)
}
ord <- order(res1[, "IAF"], decreasing = TRUE)
res1 <- res1[ord, ]
out <- data.frame(MID = rownames(res1),
Spelade = res1[, "Spelade"],
IAF = res1[, "IAF"])
rownames(out) <- 1:nrow(out)
Vi respekterar GDPR, så namnen i resultatlistan är ersatta med MID. Dessutom är resultatlistan beräknad per spelare, inte per par. Parsammansättningar kan ju variera över spelkvällarna.
Så IAF över femte omgången blir
print(out)
MID Spelade IAF
1 200585 2 1.71
2 15363 6 1.67
3 27023 2 1.65
4 13326 4 1.58
5 11072 4 1.40
6 9553 4 1.40
7 200584 4 1.38
8 36317 6 1.29
9 5401 6 1.18
10 14040 2 1.10
11 61733 2 1.10
12 3191 4 1.06
13 82732 2 0.96
14 202008 6 0.89
15 45698 4 0.87
16 84341 4 0.84
17 55268 4 0.82
18 17630 5 0.68
19 5409 4 0.67
20 3736 6 0.62
21 6210 6 0.62
22 86422 4 0.51
23 62721 2 0.44
24 85224 2 0.44
25 203441 2 0.36
26 33386 6 0.28
27 17450 6 0.28
28 12039 6 0.28
29 86586 4 0.22
30 90727 2 0.16
31 68333 2 0.16
32 15930 6 0.13
33 14818 6 0.13
34 13794 2 0.10
35 18637 4 0.08
36 6676 4 0.08
37 30068 4 -0.01
38 54501 5 -0.04
39 84354 6 -0.26
40 13938 6 -0.34
41 15204 4 -0.36
42 12766 4 -0.36
43 85226 2 -0.36
44 92512 2 -0.36
45 203648 4 -0.41
46 12506 4 -0.43
47 32414 6 -0.51
48 19673 6 -0.58
49 38619 6 -0.58
50 68246 6 -0.60
51 203445 3 -0.68
52 5421 4 -0.76
53 200583 2 -0.78
54 200582 2 -0.78
55 8406 2 -0.80
56 60863 4 -0.92
57 10752 6 -0.98
58 36321 2 -1.09
59 49619 2 -1.11
60 6737 4 -1.27
61 13087 2 -1.40
62 16956 4 -1.53
63 9714 4 -1.55
64 93895 4 -1.58
65 203439 2 -1.63
66 202011 4 -2.58
67 203438 5 -2.62
68 89018 2 -2.75
Fel och misstag i programmeringen rapporteras till gb(at)ehar(dot)se.