我在 R 中填充一个矩阵,最(?)直观的方法是使用两个嵌套循环:一个用于行,一个用于列。然而,这种方法往往很慢,通常最好使用 apply() 函数。
如果我只是用一些函数转换矩阵的现有值,那么使用 apply 一切都会很容易,但我实际上使用的是一个外部函数,它将行和列索引作为参数并返回一个值。
功能可能是这样的(只是一个例子):
myfunction <- function(rownumber, colnumber) {
if(rownumber + colnumber < 7) {
return(4)
} else {
return(2)
}
}
...有了两个嵌套循环,我们可以这样进行:
m <- matrix(0, nrow = 5, ncol = 5)
for(rownum in 1:nrow(m)) {
for(colnum in 1:ncol(m)) {
m[rownum, colnum] <- myfunction(rownum, colnum)
}
}
结果是这样的:
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 4 4 4 4 4
[2,] 4 4 4 4 2
[3,] 4 4 4 2 2
[4,] 4 4 2 2 2
[5,] 4 2 2 2 2
我想为此使用 apply() 函数,因为它通常比两个嵌套循环快,但我不知道如何获取行号和列号——或者这是否可能?一种解决方案是将行号和列号最初作为字符串保存到矩阵中,但这同样需要一些时间,因为它需要用两个嵌套循环来完成......
有什么想法吗?谢谢。
您可以使用
outer
+ ifelse
:
outer(1:nrow(m), 1:ncol(m), \(rownum, colnum) {
ifelse(rownum + colnum < 7, 4, 2)
})
# [,1] [,2] [,3] [,4] [,5]
# [1,] 4 4 4 4 4
# [2,] 4 4 4 4 2
# [3,] 4 4 4 2 2
# [4,] 4 4 2 2 2
# [5,] 4 2 2 2 2