我有一个矩阵,希望将其放入apply函数中,并使用矩阵中每个对象的位置和值来选择和更新3维数组中的位置。我可以在for循环中很容易地做到这一点,但是我很好奇是否有可能在apply函数中做到这一点。我似乎无法解决这个问题。我有一些可行的方法,但并非理想情况。
foo <- matrix(c(3, NA, NA, 1, NA, 3, NA, 2, NA),
3, 3, byrow = TRUE)
bar <- array(NA, c(3, 3, 3))
这是for循环,完全可以满足我的需求
for (i in 1:3){
for (j in 1:3){
if (!is.na(foo[i, j])){
bar[i, j, foo[i, j]] <- TRUE
}
}
}
这是我到目前为止所取得的最好成绩。它会更新数组,但是会打印出每次迭代时分配的列表。同样,如果没有<<-
运算符也可以这样做,那将是理想的选择。
fillArray <- function(x) {
if (!is.na(foo[x[1], x[2]])) {
bar[x[1], x[2], foo[x[1], x[2]]] <<- TRUE
}
}
apply(expand.grid(1:3, 1:3), 1, fillArray)
我希望得到与for循环相同的结果。
答案 0 :(得分:1)
构造三列i, j, k
矩阵索引然后进行赋值比较容易
# index matrix
m1 <- cbind(as.matrix(expand.grid(1:3, 1:3)), c(foo))
bar1 <- bar # initial data
# remove the NA rows of the third column of index
bar1[m1[!is.na(m1[,3]),, drop = FALSE]] <- TRUE
-检查OP的输出
identical(bar, bar1)
#[1] TRUE