[R-br] Solução alternativa evitando uso de loop

Marcus Nunes marcus.nunes em gmail.com
Ter Maio 28 17:51:46 -03 2019


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 em 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 em 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 em 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.
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20190528/c792ed5e/attachment.html>


Mais detalhes sobre a lista de discussão R-br