如何創建一個函式points (),它將矩陣目標作為輸入,有 2 列,行數取決于用戶的輸入?第一列是主場進球,第二列是客場進球。我怎樣才能得到目標矩陣,該函式需要第二個輸入win_points來指定團隊贏得的分數?
積分例如,贏3分,等分1分,輸0分。因此,如果一支球隊以 1-0 獲勝,則 win_point 矩陣應顯示為 3 0,如果一支球隊以 4-4 獲勝,則 win_point 矩陣應以點數顯示為 1 1。
我也這樣嘗試過,但我認為使用功能會更好。我現在在我的代碼中使用了一個 10 行和 2 列的矩陣,行應該是靈活的(你可以放置每一行),列應該是 2 固定的,因為一場比賽只有 2 支球隊。
我在下面的代碼中做錯了什么?
set.seed(1)
goals1 <- matrix(sample(0:5, size = 5*2, replace = TRUE), nrow=5, ncol=2)
points1 <- matrix(0, nrow(goals1),ncol(goals1))
for(i in 1:nrow(goals1)) {
for(j in 1:ncol(goals1)) {
if goals1[goals1[i]>goals1[j]] {
points1[i] <- 3
points1[j] <- 0
} else if goals1[goals1[i]<goals1[j]] {
points1[i] <- 0
points1[j] <- 3
} else if goals1[goals1[i]==goals1[j]] {
points1[i] <- 1
points1[j] <- 1
}
}
}
首先,感謝您提供正確代碼的答案!但是為什么上面的代碼不起作用?我不明白我在代碼中做錯了什么。請有人解釋一下!
uj5u.com熱心網友回復:
您可以創建一個簡單的矢量化函式,該函式將得分矩陣、獲勝點數(默認為 3)和平局點數(默認為 1)作為引數。然后,我們可以使用獲勝和平局點數作為乘數,對每場比賽的得分進行邏輯比較。這里不需要回圈。
points <- function(goals, win_points = 3, draw_points = 1)
{
data.frame(home = win_points * as.numeric(goals[,1] > goals[,2])
draw_points * (goals[,1] == goals[,2]),
away = win_points * as.numeric(goals[,2] > goals[,1])
draw_points * (goals[,2] == goals[,1])) |>
as.matrix()
}
因此,創建一個隨機目標矩陣,我們得到:
set.seed(1)
goals <- matrix(sample(0:5, size = 10*2, replace = TRUE), nrow=10, ncol=2)
colnames(goals) <- c("Home", "Away")
goals
#> Home Away
#> [1,] 0 0
#> [2,] 3 4
#> [3,] 0 4
#> [4,] 1 1
#> [5,] 4 5
#> [6,] 2 5
#> [7,] 5 1
#> [8,] 1 0
#> [9,] 2 4
#> [10,] 2 4
我們可以很容易地從目標矩陣中得到點矩陣:
points(goals)
#> home away
#> [1,] 1 1
#> [2,] 0 3
#> [3,] 0 3
#> [4,] 1 1
#> [5,] 0 3
#> [6,] 0 3
#> [7,] 3 0
#> [8,] 3 0
#> [9,] 0 3
#> [10,] 0 3
編輯
如果出于某種原因需要回圈,則需要簡化邏輯并僅使用單個回圈 - 由于只有兩列,因此您無需遍歷各列,只需將每行中的第 1 列與第 2 列進行比較. 以下是一個作業示例:
for(i in 1:nrow(goals1)) {
if(goals1[i, 1] > goals1[i, 2]) {
points1[i, 1] <- 3
points1[i, 2] <- 0
} else if (goals1[i, 1] < goals1[i, 2]) {
points1[i, 1] <- 0
points1[i, 2] <- 3
} else if (goals1[i, 1] == goals1[i, 2]) {
points1[i, 1] <- 1
points1[i, 2] <- 1
}
}
由reprex 包( v2.0.0 )于 2021 年 10 月 12 日創建
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/315523.html
