- Data Frrames
Os data frames em R são estruturas bidimensionais onde cada coluna pode conter apenas um tipo de dado.
1.1 Criando Data Frames
Criando via código
# Exemplo de criação de data frame
dados <- data.frame(proteina = paste0("prot", 1:4),
alteracao = rep(c("aumentada","diminuida"),2),
valor = c(5.2, 3.8, 2.1, -0.5)
)
> dados
proteina alteracao valor
1 prot1 aumentada 5.2
2 prot2 diminuida 3.8
3 prot3 aumentada 2.1
4 prot4 diminuida -0.5
Lendo de arquivo
# Leitura de arquivo CSV
dados_arquivo <- read.csv("proteinas.csv")
1.2 Propriedades de Data Frames
# Criando um data frame de exemplo
dados <- data.frame(proteina = paste0("prot", 1:4),
alteracao = rep(c("aumentada","diminuida"),2),
valor = c(5.2, 3.8, 2.1, -0.5)
)
# Dimensões do data frame: linhas colunas
> dim(dados)
[1] 4 3
# Número de linhas
> nrow(dados)
[1] 4
# Número de colunas
> ncol(dados)
[1] 3
# Nomes das linhas
> rownames(dados)
[1] "1" "2" "3" "4"
# Nomes das colunas
> colnames(dados)
[1] "proteina" "alteracao" "valor"
1.3 Subconjuntos de Data Frames
Vamos usar o seguinte data frame como exemplo:
| proteina | alteracao | valor |
|---|---|---|
| prot1 | aumentada | 5.2 |
| prot2 | diminuida | 3.8 |
| prot3 | aumantada | 2.1 |
| prot4 | diminuida | -0.5 |
Por nome
# Selecionando por nome da coluna
> dados$valor
[1] 5.2 3.8 2.1 -0.5
> dados[,"valor"]
[1] 5.2 3.8 2.1 -0.5
> dados[,c("valor","proteina")]
valor proteina
1 5.2 prot1
2 3.8 prot2
3 2.1 prot3
4 -0.5 prot4
Por valores lógicos
# Selecionando dados onde valor > 0
> dados[dados$valor>0,]
proteina alteracao valor
1 prot1 aumentada 5.2
2 prot2 diminuida 3.8
3 prot3 aumentada 2.1
Por coordenadas
# Selecionando a segunda linha
> dados[2,]
proteina alteracao valor
2 prot2 diminuida 3.8
# Selecionando a segunda coluna
> dados[,2]
[1] "aumentada" "diminuida" "aumentada" "diminuida"
# Selecionando elemento da segunda linha, segunda coluna
> dados[2,2]
[1] "diminuida"
# Selecionando as duas primeiras colunas das duas primeiras linhas
> dados[1:2,1:2]
proteina alteracao
1 prot1 aumentada
2 prot2 diminuida
# Selecionando as duas primeiras colunas da primeira e terceira linhas
dados[c(1,3),1:2]
proteina alteracao
1 prot1 aumentada
3 prot3 aumentada
Seleção quando coordenadas são desconhecidas
# Selecionando a última coluna
> dados[,ncol(dados)]
[1] 5.2 3.8 2.1 -0.5
# Selecionando todas as colunas exceto a última
> dados[,-ncol(dados)]
proteina alteracao
1 prot1 aumentada
2 prot2 diminuida
3 prot3 aumentada
4 prot4 diminuida
1.4 Modificação de Data Frames
Quando linha e coluna existem
# Modificando um elemento
dados[1,3] <- 8.5
> dados
proteina alteracao valor
1 prot1 aumentada 8.5
2 prot2 diminuida 3.8
3 prot3 aumentada 2.1
4 prot4 diminuida -0.5
# Modificando uma coluna (cada coluna é um vetor)
dados[,3] <- c(8.5,8.5,8.5,8.5)
> dados
proteina alteracao valor
1 prot1 aumentada 8.5
2 prot2 diminuida 8.5
3 prot3 aumentada 8.5
4 prot4 diminuida 8.5
# Modificando uma coluna usando o operador $
dados$alteracao <- c("aumentada","aumentada","aumentada","diminuida")
> dados
proteina alteracao valor
1 prot1 aumentada 8.5
2 prot2 aumentada 8.5
3 prot3 aumentada 8.5
4 prot4 diminuida 8.5
# Modificando uma linha (cada linha é um data frame)
dados[1,] <- data.frame("prot5","aumentada",9.0)
> dados
proteina alteracao valor
1 prot5 aumentada 9.0
2 prot2 aumentada 8.5
3 prot3 aumentada 8.5
4 prot4 diminuida 8.5
Quando linha ou coluna não existem
# Adicionando uma nova linha
dados[5,] <- data.frame("prot6","aumentada",7.2)
> dados
proteina alteracao valor
1 prot5 aumentada 9.0
2 prot2 aumentada 8.5
3 prot3 aumentada 8.5
4 prot4 diminuida 8.5
5 prot6 aumentada 7.2
# Adicionando uma linha com índice não consecutivo
dados[8,] <- data.frame("prot7","diminuida",6.3)
> dados
proteina alteracao valor
1 prot5 aumentada 9.0
2 prot2 aumentada 8.5
3 prot3 aumentada 8.5
4 prot4 diminuida 8.5
5 prot6 aumentada 7.2
6 <na> <na> NA
7 <na> <na> NA
8 prot7 diminuida 6.3
# Adicionando uma nova coluna
dados$p <- c(0.1,0.5,0.3,0.5,0.2,NA,NA,0.4)
> dados
proteina alteracao valor p
1 prot5 aumentada 9.0 0.1
2 prot2 aumentada 8.5 0.5
3 prot3 aumentada 8.5 0.3
4 prot4 diminuida 8.5 0.5
5 prot6 aumentada 7.2 0.2
6 <na> <na> NA NA
7 <na> <na> NA NA
8 prot7 diminuida 6.3 0.4
</na></na></na></na></na></na></na></na>
Modificando nomes de linhas e colunas
# Modificando todos os nomes das linhas
rownames(dados) <- paste0("amostra",1:8)
> dados
proteina alteracao valor p
amostra1 prot5 aumentada 9.0 0.1
amostra2 prot2 aumentada 8.5 0.5
amostra3 prot3 aumentada 8.5 0.3
amostra4 prot4 diminuida 8.5 0.5
amostra5 prot6 aumentada 7.2 0.2
amostra6 <na> <na> NA NA
amostra7 <na> <na> NA NA
amostra8 prot7 diminuida 6.3 0.4
# Modificando o nome da terceira coluna
colnames(dados)[3] <- "medida"
> dados
proteina alteracao medida p
amostra1 prot5 aumentada 9.0 0.1
amostra2 prot2 aumentada 8.5 0.5
amostra3 prot3 aumentada 8.5 0.3
amostra4 prot4 diminuida 8.5 0.5
amostra5 prot6 aumentada 7.2 0.2
amostra6 <na> <na> NA NA
amostra7 <na> <na> NA NA
amostra8 prot7 diminuida 6.3 0.4
</na></na></na></na></na></na></na></na>
1.5 Combinação de Data Frames
# Criando tabela teste1
teste1 <- data.frame(individuo = c("ana", "bruno", "carla", "diana"),
tipo_sangue = c("A","B","AB","O")
)
Tabela teste1:
| individuo | tipo_sangue |
|---|---|
| ana | A |
| bruno | B |
| carla | AB |
| diana | O |
# Criando tabela teste2
teste2 <- data.frame(individuo = c("ana", "bruno", "carla", "diana"),
grupo = c(1,1,2,2)
)
# Criando tabela teste3
teste3 <- data.frame(NOME = c("ana", "bruno", "carla", "diana"),
grupo = c(1,1,2,2)
)
Tabela teste2:
| individuo | grupo |
|---|---|
| ana | 1 |
| bruno | 1 |
| carla | 2 |
| diana | 2 |
Tabela teste3:
| NOME | grupo |
|---|---|
| ana | 1 |
| bruno | 1 |
| carla | 2 |
| diana | 2 |
# Quando nomes de colunas são iguais
> merge(teste1,test2,by="individuo")
individuo tipo_sangue grupo
1 ana A 1
2 bruno B 1
3 carla AB 2
4 diana O 2
# Quando nomes de colunas são diferentes
> merge(teste1,test3,by.x="individuo",by.y="NOME")
individuo tipo_sangue grupo
1 ana A 1
2 bruno B 1
3 carla AB 2
4 diana O 2
- Matrizes
As matrizes em R são estruturas bidimensionais que só permitem um tipo de dado.
2.1 Criando Matrizes
# O primeiro número indica o número de linhas
> m = matrix(1:12,3)
> m
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
2.2 Subconjuntos de Matrizes
A seleção de subconjuntos em matrizes é feita por coordenadas, semelhante aos data frames.
m = matrix(1:12,3)
> m
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
# Selecionando a segunda linha
> m[2,]
[1] 2 5 8 11
# Selecionando a segunda coluna
> m[,2]
[1] 4 5 6
# Selecionando elemento da segunda linha, quarta coluna
> m[2,4]
[1] 11
# Selecionando elementos da segunda e terceira linhas, segunda e terceira colunas
> m[c(2,3),c(2,3)]
[,1] [,2]
[1,] 5 8
[2,] 6 9
2.3 Operações com Matrizes
Transposição de Matriz
m
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
# Transposição
> t(m)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[4,] 10 11 12
Conversão de Matriz
# Convertendo matriz em data frame
> m_df = as.data.frame(m)
> class(m_df)
[1] "data.frame"
Modificando nomes de linhas e colunas
m = matrix(1:12,3)
# Modificando nomes das linhas
> rownames(m) <- 1:3
# Modificando nomes das colunas
> colnames(m) <- c("a","b","c","d")
> m
a b c d
1 1 4 7 10
2 2 5 8 11
3 3 6 9 12
- Listas
As listas em R podem conter uma mistura de diferentes estruturas de dados, como vetores, matrizes e data frames.
3.1 Criando Listas
# Criando lista l, com vetor v1, matriz m1 e data frame df1
l <- list(v1 = c(1,23,25,56),
m1 = matrix(1:9,3),
df1 =data.frame(proteina= paste0("prot",1:4))
)
> l
$v1
[1] 1 23 25 56
$m1
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
$df1
proteina
1 prot1
2 prot2
3 prot3
4 prot4
3.2 Subconjuntos de Listas
l <- list(v1 = c(1,23,25,56),
m1 = matrix(1:9,3),
df1 =data.frame(proteina= paste0("prot",1:4))
)
# Selecionando por nome
> l$v1 # Selecionando diretamente os elementos do vetor v1
[1] 1 23 25 56
# Selecionando por coordenada
> l[1] # Selecionando o vetor v1 como um todo
$v1
[1] 1 23 25 56
> class(l[1])
[1] "list" # Na verdade é uma lista
> l[[1]] # Selecionando os elementos do vetor v1
[1] 1 23 25 56
> class(l[[1]])
[1] "numeric" # É o valor dos elementos do vetor