R – referência rápida

Este artigo contém algumas notas minhas sobre o uso do R, que tenho usado como referência rápida quando fico muito tempo sem usar o programa. Com o tempo (e experiência) pretendo continuar modificando e melhorando esse artigo.

O número de possibilidades no R é obviamente muito grande para ser aqui resumido. Outras sugestões:

O básico

Variáveis

  • Devem começar com letra
  • Podem ser estruturados: results.dt, result.data, etc.
  • Letras maiúsculas e minúsculas são diferenciadas
  • Podem conter números (e.g., a1, a2)
  • Podem conter underscore (e.g. val_x)

Alguns atalhos (RStudio no Mac)

CTR + L           # limpa console
OPTION + "-"      # atalho para símbolo "<-"

Ctr + ENTER       # executa linha do script ou seleção
COMMAND + ENTER   # executa linha do script ou seleção
COMMAND + I       # 'reindent' a linha

Símbolos

#     comentário

Associações

x = 5
x <- 5

Apesar do operador “=” funcionar na linha de comando (x = 5), ele não funciona dentro de expressões e seu uso não é recomendado. Para maiores discussões veja esse link.

Operadores lógicos

<     menor
<=    menor ou igual
>     maior
>=    maior ou igual
==    igual
!x    not x
!=    diferente (not equal)
&     e
|     ou

Comandos básicos

setwd("~/user/") # define diretório de trabalho "~/user/"
require(lattice) # carrega pacote, neste caso o "lattice"
class(x)         # mostra a classe da variável x
head(dados)      # mostra apenas o começo do array dados

Área de trabalho

ls()              # mostra variáveis definidas
rm(var)           # apaga variável var
rm(list = ls())   # apaga todas as variáveis

# salva ou carrega área de trabalho no arquivo "work.Rdata"
save.image("work.RData")
load("work.RData")

Packages

install.package('data.table')   # instala o pacote
library(lattice)                # carrega o pacote

Vetores

Criação

a <- c(1, 2, 3)               # cria vetor a
a <- 1:5                      # sequência 1, 2, 3, 4, 5 (passo 1)
a <- seq(1,5)                 # idem
a <- seq(from = 1,            # sequência de 1 a 10, passo 2
        to = 10, 
        by = 2)
a <- rep(c(1,2,3), 2)         # 1, 2, 3, 1, 2, 3
a <- rep(c(1,2,3), each = 2)  # 1, 1, 2, 2, 3, 3

Reformatação

cbind(A, B)     # concatena colunas A e B
rbind(A, B)     # concatena linhas A e B

Funções com arrays

a <- 1:10     # array para teste das funções

sum(a)        # soma valores do array a
max(a)        # máximo valor do array
min(a)        # mínimo valor do array
mean(a)       # média aritmética do array
median(a)     # mediana do array
sd(a)         # desvio padrão dos valores do array
range(a)      # valores mínimo e máximo do array
prod(x)       # produto dos elementos do array

tail(a, n = 1) # últimos n elementos do array

Data frames (tabelas)

Criando tabelas

tabela <- data.frame()     # cria tabela vazia

# cria tabela vazia (sem linhas) com colunas a e b 
tabela <- data.frame(a = numeric(), b = character())

# cria "data frame" com colunas x, y e z
tabela <- data.frame(x = 1:5, y = 11:15, z = 21:25)
         x  y  z
1        1 11 21
2        2 12 22
3        3 13 23
4        4 14 24
5        5 15 25

Indexando tabelas

tabela$x         # valores da coluna x
tabela[[1]]      # valores da primeira coluna
[1] 1 2 3 4

tabela[1]        # data frame com a primeira coluna

tabela[1:2]      # data frame com colunas de 1 a 2
tabela[,1:2]   


tabela[1,]       # data frame apenas com primeira linha

tabela[,1]       # vetor com valores na primeira coluna

tabela[1,2]      # valor na primeira linha, segunda coluna
tabela[[1,2]]

tabela[1:3, 1:2] # tabela com linhas de 1 a 3 e colunas de 1 a 2

Algumas funções úteis para tabelas

nrow(tabela)     # número de linhas
ncol(tabela)     # número de colunas
length(tabela)   # número de colunas
dim(tabela)      # número de linhas e colunas
names(tabela)    # nome das colunas
rownames(tabela) # nome das linhas
colnames(tabela) # nome das colunas

# combina lista com várias tabelas em única tabela
# (requer pacote 'data.table')
rbindlist(lista)

# agrega valores (por exemplo, soma de valores de acordo com
# categorias catA e catB
aggregate(values ~ catA + catB, data = data, FUN = sum)

# aggregate com múltiplas funções
summary <- aggregate(
             values ~ catA + catB,
             data = data,
             FUN = function(x) c(mean = mean(x), sd = sd(x))
           )
# O único problema é que o resultado é uma matrix dentro do
# data frame. Isso pode ser resolvido com:
summary <- cbind(
             subset(summary, select = -values), 
             as.data.frame(summary$values))

# junta duas tabelas a partir das colunas em comum
# (se as colunas não tem o mesmo nome, é possível especificar
# as colunas a serem usadas por 'by.x =' e 'by.y =') 
merge(tabela1, tabela2)

# muda nome das colunas (pacote 'data.table')
setnames(tabela, c('oldA', 'oldB'), c('newA', 'newB'))

Reshaping tabelas entre ‘long’ e ‘wide’

# 'reshaping' de formato 'wide' para 'long'
reshape(data = tabela,
        times = c(1, 2, 3),
        timevar = time
        varying = c('colA', 'colB')
        idvar = 'observation',
        direction = 'long')

times    valores que vão ser usados
timevar  nome da coluna que vai ser criada
varying  colunas no formato 'wide' a serem combinadas
idvar    nome da nova coluna indicando cada registro


# 'reshaping' de formato 'long' para 'wide'
reshape(data = tabela,
        timevar = 'signal'
        v.names = 'values'
        idvar = c('detector', 'package') 
        direction = 'wide')

timevar   coluna com os fatores para dividir a tabela
v.names   coluna com os valores
idvar     colunas que identificam os registros

Referências úteis para tabelas

http://blog.datacamp.com/15-easy-solutions-data-frame-problems-r/

Matrizes

# cria matrix de 6 linhas e 2 colunas usando valores de x
x <- 1:12
M <- matrix(data = x, nrow = 6, ncol = 2)

M[2,3]   # seleciona elemento da 2a linha, 3a coluna

Listas

Listas permitem combinar dados de classes diferentes, o que gera confusão na hora de extrair elementos da lista usando índices.

Criação de listas

# cria lista vazia de 5 elementos
data <- vector(mode = 'list', length = 5)

# cria lista de exemplo com valores info e mode
a <- list(info = c(1, 2, 3), mode = "test, "test1", "test2")

a$info       # lista os valores info da lista a criada
a$mode       # lista os valores mode da lista a criada

a            # retorna a seguinte informação
$info
[1] 1 2 3

$mode
[1] "test" "test1" "test2"

class(a)      # retorna a seguinte informação
[1] "list"

Indexação de listas

Indexação com bracket simples (“[1]”) retorna um objeto da mesma classe, portanto também uma lista. a[1], por exemplo, é também uma lista, não um vetor. Operações que funcionam apenas em vetores, por exemplo mean, não funcionarão se aplicados em a[1], mas funcionarão se aplicados no vetor a[[1]]. Veja os seguintes exemplos.

a[1]             # retorna a seguinte informação
$info
[1] 1 2 3

a["info"]
$info
[1] 1 2 3

class(a[1])      # retorna a seguinte informação      
[1] "list"

class(a["info"])
[1] "list"


components de uma tabela que satisfazem um critério

data[data$quantity == 'dose',] 
ou
subset(data, quantity == 'dose')


components de uma tabela que satisfazem dois critérios

data[data$quantity == 'dose' & data$set == 'c',]
ou
subset(data, quantity == 'dose' & set == 'c')

Para obter o vetor contido na lista, use “[[]]” ou “$”:

a$info
[1] 1 2 3

a[[1]]
[1] 1 2 3

a[["info"]]

class(a$info)       # para checar classe do argumento
[1] "numeric"

class(a[[1]])       # para checar classe do argumento
[1] "numeric"

class(a[["info"]])  # para checar class do argumento
[1] "numeric"

Funções úteis para listas

names(lista)     # mostra nomes da lista
[1] "info" "mode"

"Deslistando"

# exemplo sobre a utilidade do unlist
lista = lapply(X = c(1,2, 3), FUN = sqrt)
lista # o resultado é uma lista
[[1]]
[1] 1

[[2]]
[1] 1.414214

[[3]]
[1] 1.732051

unlist(lista) # converte a lista em um vetor
[1] 1.000000 1.414214 1.732051

lista$a <- NULL # remove elemento a da lista
names(lista) # checa se elemento foi removido
[1] "b"

names(lista) <- c("valor", "incerteza") # muda nome dos elementos

Strings

paste("val", "lor", sep = "") # concatena strings sem separador
paste("valor = ", 3) # strings e valores podem ser concatenados
nchar(str)           # número de caracteres em str

# split characters according to regex expression
strsplit('a.b.c', split = '[.]')  

Operações com arquivos

Operações básicas

list.files(pattern = '.csv')    # lista de arquivos '.csv'

Importando dados

# obtendo uma lista de arquivos no diretório de trabalho
filenames <- list.files(pattern = '.csv')

# tabela simples em formato csv
data <- read.csv(file = "dados.csv")

# tabela simples em formato csv, dando nome às colunas
data <- read.csv(file = "dados.csv", col.names = c("x", "y"))

# tabela simples, com outro tipo de separador
data <- read.csv(file = "dados.csv", sep = ";")

Exportando dados

# exporta valores da tabela (data table)
write.table(x = tabela, 
            file = "dados.csv", 
            sep = ",")

# exporta valores sem nome das colunas e linhas
write.table(x = tabela, 
            file = "dados.csv", 
            sep = ",", 
            row.names = FALSE,
            col.names = FALSE)

# exporta tabela com sequência específica de colunas
write.table(
 x = newplan[,c("energy", "focus", "x", "y", "low", "high")], 
 file = "test.csv")

Loops e condicionais

For loop

# opção simples
for (i in 1:10) print(i)

# opção com bloco de comandos
for (i in 1:10){
      print(i)
}

# opção com lista
lista 
for (i in lista) print(i)

# usando indices
for (i in seq_along(vector)) {
      print(vector[[i]])
}

if

if (x == 2) {
      print("valor é igual a 2")
   } else if (x == 3) {
      print("valor é igual a 3")
   }
  else {
      print("valor não é 2")
   }

Funções

Funções matemáticas

log(x)             # log de x na base e
log10(x)           # log de x na base 10
log(x, base = b)   # log de x na base b

 

Funções estatísticas

mean(vetor)     # média   
sd(vetor)       # desvio padrão

 

Definindo funções

# define função simples
f <- function(x) x + 2
f(3)
[1] 5

# define função com múltiplas intruções
f <- function(x) {
     expressões
  }

 

Gráficos

Gráficos básicos

plot(x, y)

abline(h = c(0.9, 1.0, 1.1))  # adiciona linha horizontal
abline(v = c(0.9, 1.0, 1.1))  # adiciona linha vertical
abline(a = 3, b = 0.4)        # adiciona reta y = a + b*x

# box-and-whisker (útil para identificar outliers)
boxplot(y ~ x, data)

Opções de gráficos

plot(x, y,
    xlim = c(0, 1),              # limites dos eixos
    ylim = c(-3,3),
    xlab = 'x (cm)',             # nome dos eixos
    ylab = 'y (arb. units)',
    main = 'título do gráfico'   # título do gráfico
)

Gráficos do pacote ‘lattice’

bwplot(y ~ x, data)    # box-and-whisker

Salvando gráficos

# jpeg
dev.copy(device = jpeg, file = "exemplo.jpeg", width = 600, height = 500, res = 100)
dev.off()

# pdf
dev.copy(device = pdf, file = "exemplo.pdf", width = 600, paper = "USr")
dev.off()

Ajustes de dados

(Em breve.)

 

Optimização

(Em breve.)

 

Tropeços comuns

Indexação de listas

Se a é uma lista de vetores, a[1] retorna uma lista, a[[1]] retorna um vetor.

mean(a[1]) # não funciona (aplicando função em lista) 
mean(a[[1]]) # funciona (aplicando função em vetor) [1] 2

(Use class() para checar o tipo de a[1] e a[[1]].)

Sobre Eduardo Yukihara

Pesquisador | Professor | Autor
Galeria | Esse post foi publicado em Prática e ferramentas e marcado , , . Guardar link permanente.

Dê também a sua contribuição ou sugestão.

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s