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@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. _______________________________________________ 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 fornea cdigo mnimo reproduzvel.