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.
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
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.
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 ...
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 ...
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"
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
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
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)
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
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 &
.
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
Deseja contribuir? Entre em contato. Gustavo Paterno - 2014 (paternogbc@gmail.com)