O R é um programa livre multiplataforma para análises estatísticas que pode ser baixado em seu site ou adicionado na lista de repositórios de máquinas linux. Suas possibilidades de aplicação em diversas áreas são praticamente ilimitadas.
Neste blog postarei o resultado de minha experiência em sua utilização nas áreas de dinâmica de populações de peixes, ciência pesqueira e ecologia.
As postagens deste blog se destina, além de mim mesmo, a iniciantes no R e alunos da minha área de atuação.
Aprendi muito em livros e nas listas de discussão R-help e a R_STAT, mas ainda tenho muito pela frente. Agradeço desde já qualquer contribuição.

sexta-feira, 3 de dezembro de 2010

Cálculo da moda

O R trás funções para o cálculo da média (mean) e da mediana (median) mas não para moda. A sugestão postada na lista R-Help por Dr. Brian D. Ripley para distribuições discretas foi:
 
statmod <- function(x) {
  z <- table(as.vector(x))
  names(z)[z == max(z)]
}
 
n <- c(1,2,2,2,3,3)
statmod(n)
[1] "2"

quinta-feira, 28 de outubro de 2010

Como colocar vírgulas como separador decimal em gráficos

Muitas vezes em um gráfico a abscissa e/ou a ordenada apresentam valores com casas decimais. O R por padrão utiliza ponto decimal e não vírgula. Para colocar a vírgula decimal podemos sobrescrever ou escrever os valores dos eixos com as funções axis, pretty, chartr, as.character e format. O eixo (axis) 1 é o inferior, o 2 da direita, o 3 o superior e o 4 da esquerda. O número de casas decimais é indicada em nsmall.
Se colocarmos na função plot a indicação axes=F nenhum dos eixos é desenhado. Abaixo estão exemplos de como colocar vírgulas decimais.

x<-c(1,2,3,4,5)
y<-c(0.1,0.3,0.5,0.7,0.9)
plot(x,y)
axis(2,at=pretty(y),labels=chartr(".", ",", as.character(format(pretty(y),nsmall=1))))

plot(x/100,y,axes=F)
axis(1,at=pretty(x/100),labels=chartr(".", ",", as.character(format(pretty(x/100),nsmall=2))))
axis(2,at=pretty(y),labels=chartr(".", ",", as.character(format(pretty(y),nsmall=1))))
box()

terça-feira, 26 de outubro de 2010

Gráfico de barras com números sobre as barras

Para fazer um gráfico de barras com a produção descarregada de diversas frotas e indicar o número de unidades produtivas sobre cada barra utilizei as funções barplot e text. O interessante é que ao criarmos um objeto com o barplot (bp <- barplot(...)) obtemos os pontos médios de cada barra. Assim podemos utilizar estes valores para posicionar corretamente as legendas sobre as barras com text. O comando par(mar=..) indica as margens do gráfico.

Copiando os dados abaixo do clipboard temos:
CAT Prod UP
Petrecho 1 17,5 9
Petrecho 2 15,2 20
Petrecho 3 10,3 500
Petrecho 4 8,4 150
Petrecho 5 20,3 900
dados <- read.delim("clipboard",dec=",",header=T)
barras <- data.frame(dados[,c(2)])
rownames(barras)<-dados[,1]
names(barras)<-c("Prod")
barras 

Prod
Petrecho 1 17,5
Petrecho 2 15,2
Petrecho 3 10,3
Petrecho 4 8,4
Petrecho 5 20,3
   
par(mar=c(12,6,3,2),cex.axis=1.2,cex.lab=1.4)
bp<-barplot(t(as.matrix(barras)),ylim=c(0,max(dados[,2]*1.1)),las=2,ylab="Produção descarregada (t)",col="orange")
box()
text(bp,barras[,1],dados[,3],col="blue",pos=3)

Como reordenar categorias

Independendo da ordem que sejam colocadas, as categorias sempre aparecem em ordem alfabética nos sumários estatísticos e nos gráficos. No entanto muitas vezes queremos que as categorias apareçam em uma ordem determinada, como o nome dos meses. O comando utilizado é o ordered, conforme os exemplos abaixo:

categ <- rep(c("c","b","a"),c(10,10,10))
valor<-c(rnorm(10,5,2),rnorm(10,8,4),rnorm(10,12,3))
dados1<-data.frame(categ,valor)
levels(dados1$categ)
[1] "a" "b" "c"
plot(dados1)
dados1$categ<-ordered(categ, levels=c("b","c","a"))
levels(dados1$categ)
[1] "b" "c" "a"
plot(dados1)

Outra forma, mais complicada, de reordenar as categorias é:

dados1$categ <- factor(dados1$categ,levels(dados1$categ)[c(2,3,1)])
levels(dados1$categ)
[1] "c" "a" "b"
plot(dados1)

segunda-feira, 25 de outubro de 2010

Como importar dados da área de transferência (clipboard)

Uma forma simples de transferir dados de uma planilha (Excel, Calc, etc.) para o R é através da área de transferência (clipboard) através da seguinte função:
read.delim("clipboard",dec=",",header=T)

“clipboard” indica que os dados estão na área de transferência, dec=“,” que é utilizada a vírgula como separador decimal e header=T que a primeira linha contém títulos das colunas.

Considere que em uma planilha você tem os dados

Ct    Pt      Sexo
186  81,0   M
192  88,7   F
195  78,4   M
197  101,2 F
199  77,6  M
199  92,3  M
200  90,3  M
200  91,3  M
202  87,6  M

Selecione a área da planilha com os dados e copie (Ctrl C). No prompt do R escreva read.delim("clipboard",dec=",") e pressione Enter. Os dados estarão transferidos.

Também podemos fazer com que os dados da primeira coluna sejam importados como o nome das linhas, o que é útil em análises multivariadas. Para isto inserimos o parâmetro row.names=1

Para que os dados transferidos fiquem disponíveis devemos atribuí-los a um objeto: dados <- read.delim("clipboard",...) 

Como remover categorias (levels) não utilizadas

Um problema que encontramos ao subdividir um conjunto de dados é que as categorias excluídas continuam aparecendo nos sumários e nos gráficos.

Para se ver livre destas deve-se utilizar a função droplevels, que foi inserida na versão 2.12.0. No exemplo abaixo crio o data.frame dados1 onde a coluna categ possui três níveis: “a”, “b” e “c”. Em seguida crio o data.frame dados2 excluindo as linhas da categoria “b”. Veja que ela ainda conta como um nível e aparece no gráfico. Com a utilização da função droplevels este problema é contornado.

categ <- rep(c("a","b","c"),c(10,10,10))
valor<-c(rnorm(10,5,2),rnorm(10,8,4),rnorm(10,12,3))
dados1<-data.frame(categ,valor)
levels(dados1$categ)
[1] "a" "b" "c"
plot(dados1)
dados2<-subset(dados1,categ!="b")
levels(dados2$categ)
[1] "a" "b" "c"
plot(dados2) 
dados3<-droplevels(subset(dados1,categ!="b"))
levels(dados3$categ)
[1] "a" "c"
plot(dados3) 

Em casos específicos pode-se utilizar:
levels(dados2$categ[,drop=T])
[1] "a" "c"

sexta-feira, 22 de outubro de 2010

Looping para consolidar dados

Obtive dados de batimetria em


Depois de trabalhar um pouco os dados em banco de dados fiquei com uma tabela (dat.bat) que indicava o código do bloco estatístico de 10' de lado e as profundidades registradas (100 por bloco).

Meu objetivo foi consolidar as informações desta tabela que tinha cerca de 24 mil linhas em uma que contivesse por bloco os valores mínimo, médio, máximo e os quartis de 2,5%, 25%, 50%, 75% e 97,5%. Também tive a curiosidade em ver quanto tempo era gasto para processar as informações de cada bloco.

Para rodar a rotina abaixo criei um vetor com os níveis dos blocos e um data.frame para colocar os resultados dos cálculos

blocos<-levels(dat.bat$BL)
Q<-rep(0,length(blocos))
dat.stat<-data.frame(blocos,Q,Q,Q,Q,Q,Q,Q,Q)
names(dat.stat)<-c("BL","Min","Q002","Q025","Q050","Q075","Q098","Max","Med")

Depois fiz um looping para o cálculo. Inicialmente o resultado do message (ou print) só aparecia se a rotina fosse parada ou terminada. Como eu estava no Windows tive que desmarcar a saída com buffer em Misc (Ctrl W) ou colocar após o message o comando flush.console()

for (i in 1:nrow(dat.bat)) {
dat.stat[i,c(2:8)]<-quantile(dat.bat[BL==blocos[i],2],
prob=c(0,0.025,0.25,0.5,0.75,0.975,1))
dat.stat[i,9]<-mean(dat.bat[BL==blocos[i],2])
message("linha ",i," processada às ",format(Sys.time(), "%H:%M:%S"))
}

quinta-feira, 21 de outubro de 2010

Como obter dados diretamente do Access e do Excel

Para ler dados de uma tabela no Access necessitamos da biblioteca ROBDC. A conexão pode ser feita com os comandos

library(RODBC)
chan1<-odbcConnectAccess("C:/caminho/arquivo.mdb")
dat.bat <- sqlFetch(chan1,"tabela")
close(chan1)

Para obter dados do Excel utilize odbcConnectExcel. Note que as barra que indica o caminho do arquivo é "/" e não "\".

No R Wiki há uma página sobre várias outras opções de importação e exportação de dados