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

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

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

R-br mailing list
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
[hidden email]
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.
Reply | Threaded
Open this post in threaded view
|

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

R-br mailing list
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: [hidden email]

> On May 28, 2019, at 5:08 PM, Paulo Eduardo de Mesquita por (R-br) <[hidden email]> 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
> [hidden email]
> 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.

_______________________________________________
R-br mailing list
[hidden email]
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 fornea cdigo mnimo reproduzvel.
Reply | Threaded
Open this post in threaded view
|

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

R-br mailing list
In reply to this post by R-br mailing list
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



On Tue, May 28, 2019 at 5:06 PM Paulo Eduardo de Mesquita por (R-br) <[hidden email]> 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
[hidden email]
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.

_______________________________________________
R-br mailing list
[hidden email]
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.