[R-br] Loop para leitura de picos

salah salah3.1416 em gmail.com
Domingo Dezembro 20 19:26:15 BRST 2015


Olá

segue uma sugestão:

vp = function(onda){
	
	pico = NULL
	vale = NULL
	
	for(i in 2:(length(onda)-1))
	{
		
		## seleciona valores maximos
		if(onda[i+1] < onda[i] & onda[i-1] < onda[i])
		{
			p = onda[i]
			pico = rbind(pico, p)
		}## end if pico
		
		## seleciona valores minimos
		if(onda[i+1] > onda[i] & onda[i-1] > onda[i])
		{
			v = onda[i]
			vale = rbind(vale, v)
		}## end if vale
	}##end for
	
	return(rbind(pico, vale))
}## end function

## seus dados
amostra = c(49.936157, 48.133488, 45.775238, 43.229397, 40.021607,
35.927558, 31.365912, 26.849848, 23.233177, 20.770278, 18.572067,
15.590341, 11.936978, 8.478520, 5.572115, 3.272254, 1.642041, 0.999997,
1.473886, 2.616919, 4.169691, 6.464019, 9.790810, 13.820101, 17.978423,
21.674281, 24.065947, 24.875069, 24.590811, 23.620608, 22.240339,
20.676521, 19.088229, 17.689105, 16.720912, 16.358739, 16.792281,
18.321545, 21.053896, 24.777756, 29.121638, 33.551339, 37.628649,
41.272700, 44.405581, 46.899820, 48.602420, 49.253714, 48.816692,
47.380737, 44.920718)
wavelenght = seq(400, 450, by=1)

## monta um data.frame
dados = data.frame(wavelenght, amostra)

## seleciona vales e picos
a = vp(amostra)

## separa a posição dos vales e picos nos dados
pp = dados[c(match(a, dados$amostra)),]

## grafico
plot(dados, type='l')
points(pp, pch = 19, col = 'red')



Em Sáb, 2015-12-19 às 19:04 -0200, José Lucas Safanelli escreveu:
> Boa tarde, estou com o seguinte caso:
> 
> 
> DADO:
> amostra = c(49.936157, 48.133488, 45.775238, 43.229397, 40.021607,
> 35.927558, 31.365912, 26.849848, 23.233177, 20.770278, 18.572067,
> 15.590341, 11.936978, 8.478520, 5.572115, 3.272254, 1.642041,
> 0.999997, 1.473886, 2.616919, 4.169691, 6.464019, 9.790810, 13.820101,
> 17.978423, 21.674281, 24.065947, 24.875069, 24.590811, 23.620608,
> 22.240339, 20.676521, 19.088229, 17.689105, 16.720912, 16.358739,
> 16.792281, 18.321545, 21.053896, 24.777756, 29.121638, 33.551339,
> 37.628649, 41.272700, 44.405581, 46.899820, 48.602420, 49.253714,
> 48.816692, 47.380737, 44.920718)
> wavelength = seq(400, 450, by=1)
> 
> plot(wavelenght, amostra, xlab  = "Comp. Onda (nm)", ylab = 'Valor',
> type = "l")
> axis(side=1, at=seq(400, 450, by=5))
> 
> 
> PROBLEMA:
> Estou tentando ler os valores mínimos e máximos de cada pico para ter
> o valor da amplitude.
> Consigo fazer isso delimitando o intervalo de comp. de ondas da
> posição do pico, mas é muito laborioso
> EX: max(amostra[,1:20]) e min(amostraamostra[,1:20]). Amplitude seria
> a diferença deles.
> 
> 
> Para várias amostras tenho utilizado a função apply para dentro da
> linha, PORÉM decorrente da heterogeneidade das amostras, as posições
> variam causando erro de leitura e modelagem.
> 
> 
> Outro fato é que existem inúmeros picos dentro de uma faixa de
> interesse, e delimitando visualmente torna-se inviável. Para isso,
> estou tentando criar uma rotina que leia todos os picos dentro da
> faixa de interesse, para que possa utiliza-los diferentemente nas
> modelagens.
> 
> 
> Tentei o código abaixo, mas me retorna o erro que o argumento é de
> comprimento zero! 
> 
> 
> for(i in 1:length(amostra)){
>       if((amostra[i+1] > amostra[i])&(amostra[i-1]>amostra[i]))
>        print(amostra[i])
>       }
> 
> 
> (Error in if ((amostra[i + 1] > amostra[i]) & (amostra[i - 1] >
> amostra[i])) print(amostra[i]) : argument is of length zero)
> 
> 
> Um resultado que observei foi de do seguinte código, somente com uma
> condição colocada nele:
> 
> 
> for(i in 1:length(amostra)){
>       if(amostra[i+1] > amostra[i])
>        print(amostra[i])
>   }
> 
> 
> Nesse código, consegue-se ler os valores crescentes dos picos,
> desconsiderando os valores do objeto quando os valores são
> decrescentes. A partir dele que tentei colocar duas condições depois
> do IF para que ele lê-se somente os valores mínimos, mas sem sucesso. 
> 
> 
> Portanto, peço ajuda para confecção de um código que faça a leitura
> dos min e max, ou amplitude, de todos os picos da amostra, retornando
> em um objeto/dataframe para modelagem.
> 
> 
> Grato pela atenção! José Lucas.
> _______________________________________________
> 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 fornea cdigo mnimo reproduzvel.




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