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

Daniel Guimarães Tiezzi dtiezzi em usp.br
Ter Maio 28 17:37:06 -03 2019


Boa tarde Paulo

Acredito que uma função recursiva utilizando o cumsum() seria uma solução. Algo assim:

f <- function(v) cumsum(v)

v1 <- c(1,2,3,4,5,6,7,8,9,10)
f(v1)

Saída: 
[1]  1  3  6 10 15 21 28 36 45 55


daniel


Daniel Tiezzi
Professor Associado
Departamento de Ginecologia e Obstetrícia
Setor de Mastologia e Oncologia Ginecológica
Faculdade de Medicina de Ribeirão Preto - USP
Tel.: 16 3602-2488
e-mail: dtiezzi em usp.br

> On May 28, 2019, at 5:08 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.



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