Estruturas de Dados em R: Data Frames, Matrizes e Listas

  1. 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

  1. 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

  1. 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

Tags: estruturas-de-dados-R data-frames matrizes listas manipulacao-de-dados

Publicado em 6-5 01:42 por Thomas