Preenchendo valores de uma matriz com loop e condicionais

Oi, amigos!
Estou escrevendo um código para preencher uma matriz 116x3000.
O que quero: quando as colunas forem diferentes de 1,4,7,…, 2998 E que tem como valor observado na linha igual a 1, substituir por 0.5.

Para fins de exemplo, vamos supor que os meus dados são esses.


library(tidyverse)

mt_probabilidade <- runif(n = 348000,min = 0,max = 1)
mt_uniforme <- runif(length(mt_probabilidade))

live <- as.numeric((mt_probabilidade > mt_uniforme)) %>% 
    matrix(nrow = 116) %>% 
    apply(MARGIN = 2, cumprod) 

As colunas que NÃO quero preencher seguem uma PA.

coluna_selecionadas <- seq(from = 1, to = 3000, by = 3)
# 1, 4, 7, ..., 2998
 for (i in 1:nrow(live)) {
  
  for (j in 1:ncol(live)) {
    
    if(live[i,j] != live[i,coluna_selecionadas] & live[i,j]== 1) {
      live[i,j] <- 0.5
    }
    print(paste('Linha=',i,'Coluna=',j))
  }
}

Quando eu termino de executar o código e abro a matriz de resultados, verifico que a matriz preencheu até as colunas QUE não mencionei.

O warning sinaliza o seguinte output:

In if (live[i, j] != live[i, coluna_aposentados] & live[i, … :
a condição tem comprimento > 1 e somente o primeiro elemento será usado

Se alguém puder me dar uma luz e sugerir algo para corrigir o código, será muito bem vindo.

Oi @guilherme.souza !

O problema está com a condição dentro do if. O código retorna esse warning porque está retornando dentro do if um vetor de TRUE e FALSE. O R vai pegar apenas o primeiro elemento desse vetor. (observe que live[i,j] != live[i,coluna_selecionadas] retorna um vetor de TRUE e FALSE.)

Uma forma de arrumar isso seria usando %in% que vai considerar, nesse casso, se um elemento está contido em um vetor.

Além disso, se você quer verificar quando as colunas forem diferentes de 1,4,7,…, 2998 E que tem como valor observado na linha igual a 1 eu sugiro algo assim

if(!(j %in% coluna_selecionadas) & live[i,j]== 1)

2 Curtidas

Não só resolveu, como esclareceu a dúvida que pairava na minha mente.

Muito obrigado pela ajuda, @Nicole_Luduvice!