9 Introdução aos loops
Os loops em R são muito utilizados na construção de packages, entretanto, podem ser aplicados de diversas formas. Nesta seção iremos abordar os comandos if(), else(), ifelse() e for().
9.1 Comando if e else
O comando if indica a expressão “se,” ou seja, irá retornar uma saída apenas se a condição for atendida.
O comando else indica a expressão “do contrário,” ou seja, se a condição não for atendida.
Vejamos um exemplo:
Queremos testar se x é maior que 0. Vamos adotar em um primeiro caso que x é 10, dessa forma temos:
x=10
if(x<0){"Menor"}else{"Maior"} ## [1] "Maior"
Agora iremos adotar que x é -10, dessa forma temos:
x=-10
if(x<0){"Menor"}else{"Maior"} ## [1] "Menor"
9.1.1 Exemplo aplicado à estatística experimental
Considere um experimento em delineamento inteiramente casualizado em que o conjunto de dados foi simulado. Foi utilizado cinco tratamentos e quatro repetições, totalizando 20 parcelas.
set.seed(1) # vamos fixar o conjunto de dados simulados para obter os mesmos valores
resp=rnorm(20,50,4) # 20 observações de média 50 e desvio-padrão 4
trat=rep(c(paste("T",1:5)),e=4); trat=as.factor(trat)Vamos criar o modelo da análise de variância:
modelo=aov(resp~trat)Vamos testar a normalidade dos erros e nomear como norm
norm=shapiro.test(modelo$residuals)
norm$p.value # extraindo p-valor## [1] 0.752246
Vamos usar o if e else para caso a pressuposição não seja rejeitada, irá retornar a análise de variância, do contrário irá retornar "Erros não seguem distribuição normal". Dessa forma, temos:
if(norm$p.value>0.05){anova(modelo)}else{"Erros não seguem distribuição normal"}## Analysis of Variance Table
##
## Response: resp
## Df Sum Sq Mean Sq F value Pr(>F)
## trat 4 44.104 11.026 0.7897 0.5497
## Residuals 15 209.442 13.963
Como o p-valor calculado foi maior que 0.05, não rejeitamos a hipótese nula que os erros seguem distribuição normal e dessa forma, retornou-se a análise de variância. Entretanto, de forma didática, vamos modificar o p-valor da normalidade dos erros e solicitar novamente o loop. Dessa forma, temos que:
norm$p.value=0.0001 # Vamos alterar o valor de p para 0.0001 (De forma didática, jamais fazer isso!!!)
if(norm$p.value>0.05){anova(modelo)}else{"Erros não seguem distribuição normal"}## [1] "Erros não seguem distribuição normal"
Assim, como p-valor foi menor que 0.05, o R irá retornar a opção else.
9.2 Comando ifelse
Considere o mesmo exemplo da seção anterior.
set.seed(1) # vamos fixar o conjunto de dados simulados para obter os mesmos valores
resp=rnorm(20,50,4) # 20 observações de média 50 e desvio-padrão 4
trat=rep(c(paste("T",1:5)),e=4); trat=as.factor(trat)Vamos criar o modelo da análise de variância e testar a normalidade dos erros:
modelo=aov(resp~trat)
norm=shapiro.test(modelo$residuals)O Comando ifelse é a união dos comandos if e else. O primeiro argumento é a pargunta, o segundo argumento é a saída de if e o terceiro é a saída de else. Vamos gerar a saída de if como sendo "Erros seguem distribuição normal" e a saída de else como "Erros não seguem distribuição normal".
ifelse(norm$p.value>0.05, "Erros seguem distribuição normal","Erros não seguem distribuição normal")## [1] "Erros seguem distribuição normal"
9.3 Comando for
Chamando o conjunto de dados através do comando for()
set.seed(1)
x=rnorm(10,0,1)
for(i in x){print(i)}## [1] -0.6264538
## [1] 0.1836433
## [1] -0.8356286
## [1] 1.595281
## [1] 0.3295078
## [1] -0.8204684
## [1] 0.4874291
## [1] 0.7383247
## [1] 0.5757814
## [1] -0.3053884
Somando cada observação a um valor constante
set.seed(1)
x=rnorm(10,0,1)
for(i in x){result=i+1
print(result)}## [1] 0.3735462
## [1] 1.183643
## [1] 0.1643714
## [1] 2.595281
## [1] 1.329508
## [1] 0.1795316
## [1] 1.487429
## [1] 1.738325
## [1] 1.575781
## [1] 0.6946116
Solicitando se cada valor é maior ou menor que zero
set.seed(1)
x=rnorm(10,0,1)
for(i in x){result=if(i<0){"Menor"}else{"Maior"}
print(result)}## [1] "Menor"
## [1] "Maior"
## [1] "Menor"
## [1] "Maior"
## [1] "Maior"
## [1] "Menor"
## [1] "Maior"
## [1] "Maior"
## [1] "Maior"
## [1] "Menor"