
Uma possível solução é a seguinte: #### v1 <- c(1,2,3,4,5,6,7,8,9,10) v2 <- numeric(length = length(v1)) for (j in 1:length(v1)){ if(j <= 3){ v2[j] <- tail(cumsum(v1[1:j]), 1) } else { v2[j] <- tail(cumsum(v1[(j-3):j]), 1) } } v2 #### Se o comprimento de v1 for menor ou igual a 3, toma-se o último elemento de cumsum(v1) através da função tail(). Se o comprimento de v1 não for menor ou igual a 3, toma-se o último elemento de cumsum(v1[(j-3):j]), que é justamente a janela dos 4 últimos elementos da soma cumulativa. -- Marcus Nunes Professor Adjunto Universidade Federal do Rio Grande do Norte Centro de Ciências Exatas e da Terra Departamento de Estatística Laboratório de Estatística Aplicada marcus@marcusnunes.me https://marcusnunes.me/ http://shiny.estatistica.ccet.ufrn.br On Tue, May 28, 2019 at 5:06 PM Paulo Eduardo de Mesquita por (R-br) < r-br@listas.c3sl.ufpr.br> wrote:
Prezado(a)s colegas da lista,
Peço a vossa ajuda nessa questão. Embora eu já tenha uma solução, gostaria de explorar eventuais alternativas que evitem o uso do loop for.
Eu tenho um vetor de números inteiros v1 com 10 elementos.
Eu preciso de um código que produza um outro vetor numérico v2, também com 10 elementos, em que: - o valor do primeiro elemento seja igual ao valor do primeiro elemento de v1; - o valor do segundo elemento seja igual a soma do primeiro e do segundo elemento de v1; - o valor do terceiro elemento seja igual a soma do primeiro, do segundo e do terceiro elementos de v1; - todos os demais elementos (do 4o ao 10o) sejam iguais a soma dele e dos três elementos imediatamente anteriores a ele.
Tentei soluções aplicando as funções da familia apply, mas acaba caindo no loop.
Eu imagino que seja possível uma solução utilizando a função cumsum ou alguma variante que restrinja a soma aos últimos 4 elementos e defina uma regra para a exceção representada pelos 03 primeiros elementos. Qualquer ajuda nessa implementação é muito benvinda.
Grato pela atenção,
Código:
v1 <- c(1,2,3,4,5,6,7,8,9,10) v2 <- numeric(length = length(v1)) for (i in seq_along(v1)) { v2[i] <- ifelse(i < 2, v1[i], ifelse(i < 3, v1[i - 1] + v1[i], ifelse(i < 4, v1[i - 2] + v1[i - 1] + v1[i], v1[i - 3] + v1[i - 2] + v1[i - 1] + v1[i]))) } v2 data.frame(v1, v2)
-- Paulo Eduardo de Mesquita Disciplina de Infectologia - Faculdade de Medicina Universidade do Oeste Paulista Presidente Prudente - São Paulo - Brasil telefone: 5518 97718261 _______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.