O que são data frames?

Um Data Frame é essencialmente uma lista de vetores e fatores. Cada vetor ou fator representa uma coluna em um data frame (Chang, 2012)

Diferentemente de vetores, que não podem agregar elementos de classes diferentes, um data frame pode conter colunas com vetores numéricos e variáveis categóricas. É por esse motivo que a maior parte dos dados que utilizamos em nossas análises estatísticas são formatados como data frames. Por exemplo, quando desejamos relizar uma ANOVA one way, é preciso organizar uma tabela de dados com uma variável contínua (resposta) e uma variável categórica (fator). Em um data frame, as linhas representam as observações e as colunas representam as variáveis.

Como criar data frames a partir de vetores?

Imagine que temos dados de crescimento de plântulas (altura em cm) que foram submetidas a dois níveis de luminosidade: (i) com muita luz e (ii) com pouca luz. Podemos utilizar a função data.frame para juntar esses dois vetores em um objeto do tipo data.frame:

alt <- c(3,4,3,2,5,2,3,1,3,2,6,5,4,8,6,3,5,3,7,8)
luminosidade <- rep(c("muita","pouca"),each=10)
dados <- data.frame(alt,luminosidade)
dados
##    alt luminosidade
## 1    3        muita
## 2    4        muita
## 3    3        muita
## 4    2        muita
## 5    5        muita
## 6    2        muita
## 7    3        muita
## 8    1        muita
## 9    3        muita
## 10   2        muita
## 11   6        pouca
## 12   5        pouca
## 13   4        pouca
## 14   8        pouca
## 15   6        pouca
## 16   3        pouca
## 17   5        pouca
## 18   3        pouca
## 19   7        pouca
## 20   8        pouca

Como obter informações sobre a estrutura dos dados de um data frame?

A função str é muito útil para obtermos informações detalhadas sobre os objetos no R (essa função pode ser utiliza para qualquer tipo de objeto):

str(dados)
## 'data.frame':    20 obs. of  2 variables:
##  $ alt         : num  3 4 3 2 5 2 3 1 3 2 ...
##  $ luminosidade: Factor w/ 2 levels "muita","pouca": 1 1 1 1 1 1 1 1 1 1 ...

Com essa função podemos ver que o data frame dados possui 20 obervações para duas variáveis: altura e luz. Além disso, sabemos que a variável altura é numérica (num) enquanto que a variável luz é considerada um fator com dois níveis: muita e pouca. O R reconhece automaticamente que a variável luz é um fator porque os valores de cada nível se repetem. No entanto, é sempre bom verificar a estrutura dos dados com a função str para termos certeza de que o R está interpretando as variáveis de forma adequada. Para verificar variáveis de forma individualizada, podemos utilizar a função class.

class(alt)
class(luminosidade)
class(dados)
## [1] "numeric"
## [1] "character"
## [1] "data.frame"

Perceba que a variável luz foi criada como um vetor de caracteres. Quando criamos o objeto dados, a função data.frame interpretou automaticamente o vetor luz como sendo um fator com dois níveis.

Como adicionar uma coluna em um data frame?

O jeito mais fácil de adicionar uma coluna é utilizar a regra: objeto$nova_coluna <- vetor. Ou seja, você utiliza o símbolo $ após o nome do objeto e diz que valores devem ser incluídos nessa coluna. Vamos adicionar uma terceira coluna ao nosso data frame. Suponha que coletamos também o número de folhas de cada planta nos mesmos tratamentos:

fol <- c(19,21,18,18,16,21,23,21,25,22,9,7,6,7,12,9,12,2,9,4)
dados$fol <- fol
str(dados)
## 'data.frame':    20 obs. of  3 variables:
##  $ alt         : num  3 4 3 2 5 2 3 1 3 2 ...
##  $ luminosidade: Factor w/ 2 levels "muita","pouca": 1 1 1 1 1 1 1 1 1 1 ...
##  $ fol         : num  19 21 18 18 16 21 23 21 25 22 ...

Perceba que agora temos três variáveis em nosso data frame. Uma coisa muito importante é que em um data frame todas as colunas precisam ter o mesmo número de elementos (no caso 20). Se você tentar criar uma coluna nova a partir de um vetor com menos ou mais elementos que o número de linhas do data frame o R irá dar um erro.

dados$nova_coluna <- c(2,3,4)
## Error in `$<-.data.frame`(`*tmp*`, "nova_coluna", value = c(2, 3, 4)): replacement has 3 rows, data has 20

No entanto, se você criar uma coluna nova a partir de um valor, o R irá repetir esse valor para toda a coluna.

dados$nova_coluna <- 3
str(dados)
## 'data.frame':    20 obs. of  4 variables:
##  $ alt         : num  3 4 3 2 5 2 3 1 3 2 ...
##  $ luminosidade: Factor w/ 2 levels "muita","pouca": 1 1 1 1 1 1 1 1 1 1 ...
##  $ fol         : num  19 21 18 18 16 21 23 21 25 22 ...
##  $ nova_coluna : num  3 3 3 3 3 3 3 3 3 3 ...

Como excluir uma coluna de um data frame?

O jeito mais fácil de excluir uma coluna no R é através da regra: objeto$coluna <- NULL:

dados$nova_coluna <- NULL
str(dados)
## 'data.frame':    20 obs. of  3 variables:
##  $ alt         : num  3 4 3 2 5 2 3 1 3 2 ...
##  $ luminosidade: Factor w/ 2 levels "muita","pouca": 1 1 1 1 1 1 1 1 1 1 ...
##  $ fol         : num  19 21 18 18 16 21 23 21 25 22 ...

Como renomear as colunas em um data frame?

A função names pode ser utilizada para renomear as colunas de um data frame ou para saber quais são os nomes das colunas:

names(dados)
names(dados) <- c("altura","luz","folhas")
names(dados)
## [1] "alt"          "luminosidade" "fol"         
## [1] "altura" "luz"    "folhas"

Como selecionar uma coluna a partir do seu nome?

Da mesma forma que utilizamos o símbolo $ para criar uma nova coluna, podemos utilizar a regra: objeto$nome para selecionar uma coluna de um data frame.

dados$altura
dados$luz
##  [1] 3 4 3 2 5 2 3 1 3 2 6 5 4 8 6 3 5 3 7 8
##  [1] muita muita muita muita muita muita muita muita muita muita pouca
## [12] pouca pouca pouca pouca pouca pouca pouca pouca pouca
## Levels: muita pouca

Como selecionar apenas partes de um data frame?

  1. As vezes queremos olhar de forma rápida a carinha dos nossos dados. Podemos utilizar a função head() para visualizar as seis primeiras linhas ou a função tail() para visualizar as seis últimas linhas do nosso data frame.
head(dados)
##   altura   luz folhas
## 1      3 muita     19
## 2      4 muita     21
## 3      3 muita     18
## 4      2 muita     18
## 5      5 muita     16
## 6      2 muita     21
tail(dados)
##    altura   luz folhas
## 15      6 pouca     12
## 16      3 pouca      9
## 17      5 pouca     12
## 18      3 pouca      2
## 19      7 pouca      9
## 20      8 pouca      4
  1. Como os data frames possuem linhas e colunas, as vezes queremos selecionar linhas e colunas específicas. A regra geral para isso é similar a utilizada para selecionar elementos de um vetor: objeto[linhas,colunas]. Este método de indexação permite total flexibilidade e controle.
dados[1, ]        ### Seleciona apenas primeira linha 
##   altura   luz folhas
## 1      3 muita     19
dados[1:3, ]      ### Seleciona as três primeiras linhas
##   altura   luz folhas
## 1      3 muita     19
## 2      4 muita     21
## 3      3 muita     18
dados[c(1,2,5), ] ### Seleciona a primeira, a segunda e quinta linha
##   altura   luz folhas
## 1      3 muita     19
## 2      4 muita     21
## 5      5 muita     16

Importante: O espaço vazio dentro do colchetes diz para o R selecionar todas as colunas. O mesmo se aplica se o espaço das linhas for deixado em branco dados[ ,colunas].

dados[ ,2]        ### Seleciona apenas a segunda coluna (todas as linhas)
dados[ ,1:2]      ### Seleciona a primeira e a segunda coluna (todas as linhas)
  1. Podemos agora combinar as duas coisas para selecionar elementos específicos.
dados[8,3]           ### Seleciona elemento da linha 8 e coluna 3
## [1] 21
dados[1:3,1]         ### Seleciona os elementos das três primeiras linhas e da coluna 1
## [1] 3 4 3
dados[c(10,11),1:2]  ### Seleciona linhas 10 e 11 e colunas 1 e 2
##    altura   luz
## 10      2 muita
## 11      6 pouca

Como selecionar partes de um data frame por condição lógica?

Imagine que queremos selecionar apenas as observações nas quais as plantas possuem altura maior que 3. Podemos então perguntar para o R quais são esses elementos e depois utilizar a resposta dentro dos colchetes.

dados$altura > 3     ### Quais valores de altura são maiores que 3?
##  [1] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE
## [12]  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE
dados[dados$altura > 3, ]  ### Linhas com altura maior que 3
##    altura   luz folhas
## 2       4 muita     21
## 5       5 muita     16
## 11      6 pouca      9
## 12      5 pouca      7
## 13      4 pouca      6
## 14      8 pouca      7
## 15      6 pouca     12
## 17      5 pouca     12
## 19      7 pouca      9
## 20      8 pouca      4

Podemos agora combinar filtros diferentes. Suponha que queremos selecionar as plantas com altura maior que três, mas apenas aquelas no tratamento: muita luz

dados[dados$altura > 3 & dados$luz =="muita", ]  ### Linhas com altura maior que 3 e luz = muita
##   altura   luz folhas
## 2      4 muita     21
## 5      5 muita     16

Uma forma mais fácil de fazer a mesma coisa é através a função subset(). A regra geral é: subset(dados,condição). Para saber mais sobre a função subset, ?subset. Vamos ver alguns exemplos:

subset(dados,altura > 3)     ### Seleciona observações com altura maior que 3
subset(dados,luz == "muita") ### Seleciona apenas as observações com luz == "muita"

Combinando as duas coisas:

subset(dados,altura > 3 & luz == "muita") ### Seleciona observações com altura maior que 3 e com luz == "muita"
##   altura   luz folhas
## 2      4 muita     21
## 5      5 muita     16
subset(dados,altura > 3 & luz == "muita" & folhas > 20) ### Seleciona observações com altura maior que 3, com luz == "muita" e folhas maior 20
##   altura   luz folhas
## 2      4 muita     21

Importante: Toda vez que quiser utilizar mais de uma condição lógica para selecionar valores (como nos exemplos acima), separe cada condição com o símbolo &.

Como substituir colunas ou elementos de um data frame?

Para substituir valores de uma data frame a regra básica é objeto[linha,coluna] <- valor. Podemos também substituir por condição lógica.

dados[1,1] <- 3   ### Subsitui o elemento da linha 1, coluna 1 por 3
dados[2,1] <- 5   ### Subsitui o elemento da linha 2, coluna 1 por 5
dados[dados$altura > 3,1] <- 10 ### Substitui todos os elementos com altura > 3 da coluna 1 por 10

Por fim, a função summary() pode ser utilizada sintetizar as informações de cada coluna de um data frame.

summary(dados)
##      altura         luz         folhas     
##  Min.   : 1.00   muita:10   Min.   : 2.00  
##  1st Qu.: 3.00   pouca:10   1st Qu.: 8.50  
##  Median : 6.50              Median :14.00  
##  Mean   : 6.25              Mean   :14.05  
##  3rd Qu.:10.00              3rd Qu.:21.00  
##  Max.   :10.00              Max.   :25.00

Para aprender mais:

  1. Brinque com os comandos apresentados, invente os seus próprios dados e tente coisas novas. Quando cometer erros, leia atentamente a mensagem de erro.
  2. Leia o post sobre como acessar valores de um vetor

Referências:

  1. Mike Allerhand, 2011. A Tiny Handbook of R. Springer, ISBN: 978-3-642-17979-2
  2. Winston Chang, 2012. R Graphics Cookbook: Practical Recipes for Visualizing Data. O’Reilly Media

Deseja contribuir? Entre em contato. Gustavo Paterno - 2014 (paternogbc@gmail.com)