Используйте функции apply для итеративного обновления одного и того же объекта (для цикла, чтобы применить функцию) - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть матрица, которую я хочу поместить в функцию применения и использовать местоположение и значение каждого объекта в матрице для выбора и обновления позиций в 3-мерном массиве.Я могу сделать это очень легко в цикле for, но мне любопытно, возможно ли это сделать в функции применения.Кажется, у меня проблемы с тем, чтобы обернуть голову вокруг этого.У меня есть некоторые вещи, которые работают, но не в идеале.

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 Ответ

1 голос
/ 04 апреля 2019

Проще построить матричный индекс из трех столбцов 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...