terça-feira, 18 de novembro de 2014

Dividir seus dados em subconjuntos, ou melhor, escolher apenas as partes que sejam relevantes para o seu trabalho é um importante componente da etapa de pré-processamento dos dados. No decorrer deste post vamos mostrar diversas maneiras de realizar esta tarefa com o R.

Começamos com a criação do data frame que será usado em todos os exemplos. Para quem ainda não está muito familiarizado com o conceito de data frame no R, comece entendendo que eles nada mais são do que objetos utilizados para armazenar tabelas com seus dados. É algo muito parecido com uma tabela do Access do do SQL. E diferença fundamental entre um data frame e uma matriz é que no data frame os dados não precisam de ser todos do mesmo tipo.

Prosseguindo, vamos chamar nosso data frame de x.df, que será composto de 5 variáveis chamadas de V1  até V5. Os valores de cada variável virão de uma distribuição normal com média 0 e desvio padrão 1. Adicionalmente, vamos criar uma variável y contendo inteiros de 1 a 5.

# Cria x e y
x <- matrix(rnorm(30, 1), ncol = 5)
y <- c(1, seq(5))

#combina x e y em uma única matriz x
x <- cbind(x, y)

#converte x em no data frame x.df
x.df <- data.frame(x)

#exibe o data frame criado
x.df
          V1         V2          V3        V4          V5 y
1 -1.6862356  1.3950211  1.35898920 1.8492410  1.75368860 1
2  0.8610318 -0.5698281 -0.01984841 0.3570547 -0.93262483 1
3 -1.3736436  0.1280908  0.17866428 1.6930332  0.42080132 2
4  0.7557265  1.8622043 -0.29684582 1.0555782  0.09372863 3
5  0.6296957  1.7943359  2.16226397 0.1604166  0.37218504 4
6  0.4694073  1.3096533  1.90324318 1.9372227  1.43930020 5



Vamos utilizar a função names() para visualizar os atributos do data frame.

names(x.df)
[1] "V1" "V2" "V3" "V4" "V5" "y"


Agora, vamos utilizar a função subset() para fazer o primeiro processamento com nossos dados. Vamos criar uma variável chamada x.sub e armazenar todos os valores de x.df que contenham y > 2.

x.sub <- subset(x.df, y > 2)
x.sub
         V1       V2         V3        V4         V5 y
4 0.7557265 1.862204 -0.2968458 1.0555782 0.09372863 3
5 0.6296957 1.794336  2.1622640 0.1604166 0.37218504 4
6 0.4694073 1.309653  1.9032432 1.9372227 1.43930020 5


Vamos deixar nossa seleção um pouco mais complexa, adicionando uma condicional. Vamos selecionar os registros que contenham y > 2 e V1 > 0.6 e armazenar os dados na variável x.sub1.

x.sub1 <- subset(x.df, y > 2 & V1 > 0.6)
x.sub1
         V1       V2         V3        V4         V5 y
4 0.7557265 1.862204 -0.2968458 1.0555782 0.09372863 3
5 0.6296957 1.794336  2.1622640 0.1604166 0.37218504 4

Repare que em nós retornamos sempre todas as colunas em nossas seleções. Vamos agora realizar uma outra tarefa, retornando apenas os atributos V1 e V4.

x.sub2 <- subset(x.df, y > 2 & V2 > 0.4, select = c(V1, V4))
x.sub2
         V1        V4
4 0.7557265 1.0555782
5 0.6296957 0.1604166
6 0.4694073 1.9372227

Vamos criar agora uma terceira partição do nosso data frame, a x.sub3. Nela, vamos selecionar os registros com valores de y  maiores do que 3 e todas as colunas entre V2 e V5.

x.sub3 <- subset(x.df, y > 3, select = V2:V5)
x.sub3
        V2       V3        V4       V5
5 1.794336 2.162264 0.1604166 0.372185
6 1.309653 1.903243 1.9372227 1.439300

Uma outra forma de realizar uma seleção é utilizando o conceito de índices. Ele se baseia no fato de que você pode selecionar os dados de um data frame chamando o comando nomeDataFrame$nomeAtributo. Vamos selecionar os registros com valores de y iguais a 1.

x.sub4 <- x.df[x.df$y == 1, ]
x.sub4
          V1        V2          V3        V4         V5 y
1 -1.6862356  1.395021  1.35898920 1.8492410  1.7536886 1
2  0.8610318 -0.569828 -0.01984841 0.3570547 -0.9326248 1

Agora, realizaremos uma seleção utilizando a notação %in%. Muito parecido com a sintaxe do SQL, ela retorna todos os valores contidos em um determinado vetor. Veja o exemplo abaixo.

x.sub5 <- x.df[x.df$y %in% c(1, 4), ]
x.sub5
          V1        V2          V3        V4         V5 y
1 -1.6862356  1.395021  1.35898920 1.8492410  1.7536886 1
2  0.8610318 -0.569828 -0.01984841 0.3570547 -0.9326248 1
5  0.6296957  1.794336  2.16226397 0.1604166  0.3721850 4

Agora, da mesma forma que selecionamos registro baseado no conceito de índice, vamos fazer o mesmo para colunas, selecionando apenas as duas primeiras colunas, V1 e V2 em nossa variável x.sub6. Veja que deixar o primeiro argumento em branco significa retornar todos os registros das colunas selecionadas.

x.sub6 <- x.df[, 1:2]
x.sub6
          V1         V2
1 -1.6862356  1.3950211
2  0.8610318 -0.5698281
3 -1.3736436  0.1280908
4  0.7557265  1.8622043
5  0.6296957  1.7943359
6  0.4694073  1.3096533

Este mesmo conceito pode ser utilizado se desejarmos selecionar, por exemplo, apenas a primeira, terceira e quinta variável do nosso data frame x.df.

x.sub7 <- x.df[, c(1, 3, 5)]
x.sub7
          V1          V3          V5
1 -1.6862356  1.35898920  1.75368860
2  0.8610318 -0.01984841 -0.93262483
3 -1.3736436  0.17866428  0.42080132
4  0.7557265 -0.29684582  0.09372863
5  0.6296957  2.16226397  0.37218504
6  0.4694073  1.90324318  1.43930020

Naturalmente isto implica em podermos selecionar linhas e colunas baseadas no conceito de índices.

x.sub8 <- x.df[c(1, 3), 3:6]
x.sub8
         V3       V4        V5 y
1 1.3589892 1.849241 1.7536886 1
3 0.1786643 1.693033 0.4208013 2

Esta são algumas das formas possíveis de fazer parte do pré-processamento de dados no R.

Um abraço e até o próximo post!



Adaptado de:
Frequently Asked Questions about R. UCLA: Statistical Consulting Group.
from http://www.ats.ucla.edu/stat/r/faq/subset_R.htm (accessed November 15, 2014).

0 comentários:

Postar um comentário