Exercícios 9 - Construção de Funções Simples ##1. - Exercício Programar 1.: QUE FRIO! #1.1 - Construa uma função que calcula automaticamente o valor de graus Celsius, sabendo-se a temperatura em Fahrenheit. C° = 5/9 * (F°- 32) conv.FC <- function(x) { dados=na.omit(x) faren = x Celsius = c(rep(0,length(x))) for(i in 1:length(x)) { Celsius[i] = (5/9)*(x[i]-32) } return(Celsius) } faren = c(32,212) conv.FC(faren) [1] 0 100 #2. : Análise exploratória simultânea de duas variáveis Crie uma função para saída gráfica de análises exploratórias de duas variáveis. Essa saída pode ter por exemplo boxplot, histograma, qq norm e y por x. A função deve permitir a entrada de dois objetos vetores de mesmo tamanho (x e y). Caso os valores de x e y forem desenhados em um mesmo gráfico, defina cores diferentes. As legendas devem ser em português e a saída (return) deve apresentar o sumário das duas variáveis e o coeficiente de correlação. DICAS: Para histogramas com variáveis em um mesmo gráfico pode ser utilizada a função multhist() do pacote “plotrix”. Baixe e instale o pacote e veja o help da função Utilize o código do eda.shape, apresentado em aula como ponto de partida. Lembre-se que em algumas funções gráficas o argumento add=TRUE, adiciona elementos no gráfico no anterior. a = c(round(runif(10,1,20),0)) b = c(round(runif(10,1,50),0)) eda.shape.GUTO <- function(x,y) { z =length(x)!=length(y) lista = list(x,y) if (z=="TRUE") { cat("\t"," Vetores de comprimentos diferentes\n") #return(NA) } else { library(plotrix) x11() par(mfrow = c(2,2)) multhist(lista, main="Histograma de x e y", col=c("red","blue")) boxplot(lista, col=c("red","blue"), main="BoxPlot de x e y") plot(y,col="red",xlab="",ylab="y", main="Função de y e x") par(new=T) plot(x,col="blue",xlab="",ylab="x", main="Função de y e x", ann=F, axes=F) axis(4) qqnorm(y,col="red",main="Gráfico Quantil x Quantil",xlab="Quantil Teórico",ylab="Quantil da Amostra") qqline(y) par(new=T) qqnorm(x,col="blue",main="Gráfico Quantil x Quantil",xlab="Quantil Teórico",ylab="Quantil da Amostra") qqline(x) axis(4) par(mfrow=c(1,1)) } } eda.shape.GUTO(a,b) #3. : Índices de Diversidade de Espécies #Índice de Shannon: H = - sum(pi * ln(pi)) # Índice de Simpson: D = sum(pi^2) #Criando os vetores de especies e de número de individuos esp=paste("especie",1:20) par1 = sample(round(c(runif(4,21,40),runif(4,10,20),runif(4,1,9),runif(8,1,3)),0)) par2 = sample(round(c(runif(4,21,40),runif(4,10,20),runif(4,1,9),runif(8,1,3)),0)) par3 = sample(round(c(runif(4,21,40),runif(4,10,20),runif(4,1,9),runif(8,1,3)),0)) list.esp=data.frame(esp,par1,par2,par3) list.esp[10,2] = NA log(0) # Funcao diversidade, calcula os indices de Shannon e Simpson # Necessariamente o data.frame deve conter na primeira coluna as espécies, seguida de um número qualquer de areas Diversidade = function(x) { list.esp=x dim(list.esp) #Verifica a dimensão de x e captura o número de linhas e colunas n=dim(list.esp)[2]-1#Subtracao da coluna de especies para facilitar a indexacao l=dim(list.esp)[1] #Transforma os NA em 0, no Shannon os valores 0 se tornaram NaN e são corridos novamente no final da função for (i in 1:n) { list.esp[is.na(list.esp[,i+1])==T, i+1] = 0 } #Cria os vetores necessarios para os loops Pi=data.frame(rep(0,l)) H=data.frame(rep(0,l)) D=data.frame(rep(0,l)) #Cria os data.frames necessarios para os loops ### Obs: Professor, eu conseguiria criar os data.frames de uma vez, sem ter que utilizar 2 FOR pra isso ? ### for (k in 1:(n-1)) { Pi=data.frame(Pi,rep(0,l)) H=data.frame(H,rep(0,l)) D=data.frame(D,rep(0,l)) } #Calculo dos indices de Shannon e Simpson for (i in 1:n) #indexa o numero de colunas { for (j in 1:l)#indexa o numero de linhas { Pi[j,i] = list.esp[j,i+1]/sum(list.esp[,i+1]) H[j,i] = -(Pi[j,i] * log(Pi[j,i])) D[j,i] = (Pi[j,i]^2) } } #Corrige os NaN gerados pelo log do indice de Shannon antes de realizar o somatorio for (i in 1:n) { H[is.nan(H[,i])==T, i] = 0 D[is.nan(D[,i])==T, i] = 0 } names(H) = paste("Area",1:n) names(D) = paste("Area",1:n) return(list(H=apply(H,2,sum),D=apply(D,2,sum))) #Retorna uma lista com os indices de Shannon e Simpson } Diversidade(list.esp) Diversidade(list.esp)