r语言 - 如何使用循环和函数从另一个矩阵的输出创建一个新的矩阵?



我如何创建一个函数点(),这需要矩阵目标作为输入,有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
}
}
}

首先,感谢你的答案和正确的代码!但是为什么上面的代码不能工作呢?我不明白我在代码中做错了什么。有人能解释一下吗?

您可以创建一个简单的矢量化函数,该函数将得分矩阵、获胜的点数(默认为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)在20121-10-12创建

最新更新