segunda-feira, 28 de janeiro de 2013

Data Frame - R and Python

Para acessar alguns dados com R, e poder realizar operações, utilizamos a função data.frame podendo agrupando fatores entre outras operações. Em Python a coisa pode ser bastante parecida e com diversas funcionabilidades do pacote Pandas [1] para Python.

Digamos uma tabela da seguinte maneira:
ID sp1 sp2 sp3
C1   1   3   2
C1   3   2   0
C1   2   1   1
C2   2   4   0
C2   1   3   1
C3   0   3   4
C3   2   1   2

#! /usr/bin/R
> dados = read.table('dados.txt', header=T)
> dados
  ID sp1 sp2 sp3
1 C1   1   3   2
2 C1   3   2   0
3 C1   2   1   1
4 C2   2   4   0
5 C2   1   3   1
6 C3   0   3   4
7 C3   2   1   2

> attach(dados)

# transformando a coluna ID em fator.
> dados$ID <- data-blogger-escaped-colunas="" data-blogger-escaped-dados.="" data-blogger-escaped-dados="" data-blogger-escaped-das="" data-blogger-escaped-de="" data-blogger-escaped-factor="" data-blogger-escaped-uma="" data-blogger-escaped-ver=""> dados$sp1
[1] 1 3 2 2 1 0 2

# para fazer uma média, por exemplo, utilizando o fator ID.
> xsp1 <- data-blogger-escaped-mean="" data-blogger-escaped-sp1="" data-blogger-escaped-tapply="" id=""> xsp1
 C1  C2  C3 
2.0 1.5 1.0 

Para fazer isso em Python, você poderia usar o numpy, simplesmente, ou usar as elegantes ferramentas do "pandas". Para quem vem do R, o Pandas é uma forma fácil de se entender com dados tabelados e cheios de fatores.
>>> import pandas as pd
>>> dados = pd.read_table('dados.txt',sep=" ")
>>> dados
   ID  sp1  sp2  sp3
0  C1    1    3    2
1  C1    3    2    0
2  C1    2    1    1
3  C2    2    4    0
4  C2    1    3    1
5  C3    0    3    4
6  C3    2    1    2

# Acessar somente uma das colunas.
>>> dados['sp1']
0    1
1    3
2    2
3    2
4    1
5    0
6    2
Name: sp1

# Para fazer a média, com a função groupby
>>> dados.groupby('ID').sp1.mean()
ID
C1    2.0
C2    1.5
C3    1.0
Name: sp1

# Ainda é possível fazer várias coisas com o objeto dados (que agora é um DataFrame).
# Por exemplo, pegar a média e a variância, ordenados por ID.
>>> dados.groupby('ID').sp1.agg(['mean', 'var'])
    mean  var
ID           
C1   2.0  1.0
C2   1.5  0.5
C3   1.0  2.0

Até mais.
[1] http://pandas.pydata.org/