使用Apply函数来迭代更新同一对象(用于循环以应用函数)

时间:2019-04-04 01:43:20

标签: r

我有一个矩阵,希望将其放入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循环相同的结果。

1 个答案:

答案 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