getwd()[1] "/Users/marcelocarlosribeiro/Documents/2026.1/EST 128/Aulas/Aula 3 "
Compreender como importar e exportar dados no R, trabalhando com arquivos de texto, arquivos .csv, arquivos .csv2, objetos .RData, arquivos .rds e, de forma introdutória, planilhas do Excel.
Nas aulas anteriores, estudamos objetos, vetores, matrizes, dataframes e listas. Agora vamos aprender como trazer dados externos para dentro do R e como salvar resultados produzidos durante uma análise.
Uma análise de dados raramente começa com os dados digitados manualmente no R. Na prática, os dados costumam estar em arquivos externos, como .txt, .csv, .xlsx ou arquivos próprios do R.
Antes de importar ou exportar arquivos, precisamos saber em qual pasta o R está trabalhando.
getwd()[1] "/Users/marcelocarlosribeiro/Documents/2026.1/EST 128/Aulas/Aula 3 "
A função getwd() mostra o diretório de trabalho atual. É nessa pasta que o R vai procurar arquivos quando não informamos o caminho completo.
Também podemos listar os arquivos disponíveis no diretório atual.
list.files() [1] "alfafa.txt" "aula3_files"
[3] "aula3.html" "aula3.qmd"
[5] "aula3.rmarkdown" "clientes.csv"
[7] "dados_aula3.RData" "dados_brasil.csv"
[9] "estilo.css" "notas.RData"
[11] "notas.rds" "notas.txt"
[13] "producao.csv" "resultado_csv2.csv"
[15] "resultado_write_csv.csv" "resultado_write_csv2.csv"
[17] "resultado.csv" "resultado.rds"
[19] "resultado.txt" "resultado.xlsx"
[21] "rsconnect"
O caminho do diretório varia de computador para computador. Por isso, o exemplo abaixo está comentado.
# setwd("C:/meus_dados")No R, usamos / no caminho das pastas. Mesmo no Windows, evite escrever caminhos com \.
Antes de importar dados, é importante verificar como o arquivo está organizado.
Ao preparar uma base para ser lida no R:
_ para separar palavras.O R vai interpretar o arquivo exatamente como ele está escrito. Quanto mais organizada estiver a base, menor será a chance de erro na importação.
Para que esta aula funcione em qualquer computador, vamos criar alguns arquivos temporários. Depois vamos importar esses arquivos de volta para o R.
alfafa <- data.frame(
trat = c("A", "A", "A", "B", "B", "B", "C", "C", "C"),
bloco = c("I", "II", "III", "I", "II", "III", "I", "II", "III"),
prod = c(2.89, 2.88, 1.88, 1.58, 1.28, 1.22, 2.29, 2.98, 1.55)
)
alfafa.txt de exemplowrite.table(
x = alfafa,
file = "alfafa.txt",
sep = " ",
quote = FALSE,
row.names = FALSE
)
list.files() [1] "alfafa.txt" "aula3_files"
[3] "aula3.html" "aula3.qmd"
[5] "aula3.rmarkdown" "clientes.csv"
[7] "dados_aula3.RData" "dados_brasil.csv"
[9] "estilo.css" "notas.RData"
[11] "notas.rds" "notas.txt"
[13] "producao.csv" "resultado_csv2.csv"
[15] "resultado_write_csv.csv" "resultado_write_csv2.csv"
[17] "resultado.csv" "resultado.rds"
[19] "resultado.txt" "resultado.xlsx"
[21] "rsconnect"
A função write.table() é usada para exportar objetos do R, como dataframes ou matrizes, para arquivos de texto.
Neste exemplo:
x = alfafa: indica qual objeto será exportado. Aqui estamos exportando o dataframe alfafa.file = "alfafa.txt": define o nome do arquivo que será criado.sep = " ": define o separador entre as colunas. Neste caso, usamos espaço.quote = FALSE: evita que textos sejam salvos entre aspas.row.names = FALSE: evita salvar a numeração das linhas como uma coluna extra.Não é necessário instalar nenhum pacote para usar write.table(), pois essa função pertence ao R base.
.csv de exemploproducao <- data.frame(
x = 1:10,
y = c(6.7, 7.9, 9.1, 6.6, 7.5, 8.8, 7.7, 7.6, 6.5, 7.9)
)
write.table(
x = producao,
file = "producao.csv",
sep = ";",
dec = ".",
quote = FALSE,
row.names = FALSE
)
producaoNeste exemplo, alguns argumentos já foram usados anteriormente, como x, file, sep, quote e row.names.
O novo argumento importante aqui é:
dec = ".": define qual símbolo será usado como separador decimal no arquivo exportado. Neste caso, os números serão salvos com ponto decimal, como 6.7, 7.9 e 9.1.Além disso:
sep = ";": indica que as colunas serão separadas por ponto e vírgula. Esse formato é muito comum em arquivos .csv usados no Brasil.file = "producao.csv": cria um arquivo chamado producao.csv no diretório de trabalho.producao: ao final do código, apenas imprime o dataframe no documento para visualizarmos os dados criados.read.table()A função read.table() é uma das funções mais gerais para importar dados em formato de texto.
Alguns argumentos muito usados em read.table() são:
file: nome ou caminho do arquivo.header: indica se a primeira linha contém os nomes das colunas.sep: indica o separador das colunas.dec: indica o separador decimal..txtdados_alfafa <- read.table(
file = "alfafa.txt",
header = TRUE
)
dados_alfafaComo o arquivo alfafa.txt está no diretório de trabalho, não precisamos informar o caminho completo.
.csv com separador ;dados_producao <- read.table(
file = "producao.csv",
header = TRUE,
sep = ";",
dec = "."
)
dados_producaoSe o arquivo usa ; para separar colunas, precisamos informar sep = ";". Se usa vírgula como separador decimal, precisamos informar dec = ",".
Também podemos importar dados diretamente de uma URL.
Nesta seção, vamos usar a base Iris, uma base clássica e didática com medidas de flores. Ela possui informações como comprimento e largura das sépalas e pétalas, além da espécie da flor.
Quando usamos uma URL como argumento em read.table(), o R tenta acessar o arquivo diretamente pela internet. Por isso, esse exemplo depende de conexão ativa.
url_iris <- paste0(
"https://raw.githubusercontent.com/",
"pandas-dev/pandas/main/pandas/tests/io/data/csv/iris.csv"
)
dados_iris <- read.table(
file = url_iris,
header = TRUE,
sep = ",",
dec = "."
)
head(dados_iris)Neste exemplo:
A função paste0()junta textos sem inserir espaços entre eles. Neste exemplo, usamos past0()apenas para deixar a URL mais organizada no código:
Também poderia ser escrito diretamente assim:
url_iris <- "https://raw.githubusercontent.com/pandas-dev/pandas/main/pandas/tests/io/data/csv/iris.csv"file = url_iris: indica que o arquivo será lido diretamente de uma URL.header = TRUE: informa que a primeira linha do arquivo contém os nomes das colunas.sep = ",": informa que as colunas estão separadas por vírgula.dec = ".": informa que os números usam ponto como separador decimal.Depois de importar dados da internet, é interessante conferir a estrutura do objeto criado.
str(dados_iris)'data.frame': 150 obs. of 5 variables:
$ SepalLength: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ SepalWidth : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ PetalLength: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ PetalWidth : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Name : chr "Iris-setosa" "Iris-setosa" "Iris-setosa" "Iris-setosa" ...
summary(dados_iris) SepalLength SepalWidth PetalLength PetalWidth
Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
Median :5.800 Median :3.000 Median :4.350 Median :1.300
Mean :5.843 Mean :3.054 Mean :3.759 Mean :1.199
3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
Name
Length:150
Class :character
Mode :character
Esse tipo de importação depende de conexão com a internet. Quando os dados forem importantes para uma análise, pode ser uma boa ideia salvá-los localmente.
.csvAlém de read.table(), existem funções específicas para arquivos .csv.
read.csv()dados_csv <- read.csv(
file = "producao.csv",
sep = ";",
dec = "."
)
dados_csvread.csv2()A função read.csv2() é útil quando o arquivo usa ; como separador de colunas e , como separador decimal, padrão comum em arquivos gerados no Brasil.
dados_brasil <- data.frame(
trt = c(1, 1, 2, 2, 3, 3),
y = c(19.4, 32.6, 17.7, 24.8, 17.0, 19.4)
)
write.table(
x = dados_brasil,
file = "dados_brasil.csv",
sep = ";",
dec = ",",
quote = FALSE,
row.names = FALSE
)
dados_brasil_lido <- read.csv2("dados_brasil.csv")
dados_brasil_lidoDepois de importar uma base, devemos verificar se ela foi lida corretamente.
str(dados_producao)'data.frame': 10 obs. of 2 variables:
$ x: int 1 2 3 4 5 6 7 8 9 10
$ y: num 6.7 7.9 9.1 6.6 7.5 8.8 7.7 7.6 6.5 7.9
head(dados_producao)summary(dados_producao) x y
Min. : 1.00 Min. :6.50
1st Qu.: 3.25 1st Qu.:6.90
Median : 5.50 Median :7.65
Mean : 5.50 Mean :7.63
3rd Qu.: 7.75 3rd Qu.:7.90
Max. :10.00 Max. :9.10
Depois de importar dados, sempre confira:
A função write.table() permite exportar objetos do R, como dataframes e matrizes, para arquivos de texto.
A lógica de exportação para .txt, .csv e .csv2 é muito parecida. O que muda principalmente são os argumentos sep e dec.
| Formato | Separador de colunas | Separador decimal | Função equivalente |
|---|---|---|---|
.txt |
tabulação ou espaço | ponto | write.table() |
.csv |
vírgula | ponto | write.csv() |
.csv2 |
ponto e vírgula | vírgula | write.csv2() |
resultado <- data.frame(
grupo = c("A", "B", "C"),
media = c(2.55, 1.36, 2.27)
)
resultado.txtwrite.table(
x = resultado,
file = "resultado.txt",
sep = "\t",
quote = FALSE,
row.names = FALSE
)Neste exemplo, usamos sep = "\t", que indica separação por tabulação. Esse formato costuma organizar bem os dados em arquivos .txt.
.csvwrite.table(
x = resultado,
file = "resultado.csv",
sep = ",",
dec = ".",
quote = FALSE,
row.names = FALSE
)O formato .csv tradicional usa vírgula para separar colunas e ponto como separador decimal.
Também podemos usar a função atalho write.csv().
write.csv(
x = resultado,
file = "resultado_write_csv.csv",
row.names = FALSE
).csv2write.table(
x = resultado,
file = "resultado_csv2.csv",
sep = ";",
dec = ",",
quote = FALSE,
row.names = FALSE
)O formato .csv2 é muito comum no Brasil, pois usa ponto e vírgula para separar colunas e vírgula como separador decimal.
Também podemos usar a função atalho write.csv2().
write.csv2(
x = resultado,
file = "resultado_write_csv2.csv",
row.names = FALSE
)resultado_txt <- read.table(
file = "resultado.txt",
header = TRUE,
sep = "\t"
)
resultado_csv <- read.table(
file = "resultado.csv",
header = TRUE,
sep = ",",
dec = "."
)
resultado_csv2 <- read.table(
file = "resultado_csv2.csv",
header = TRUE,
sep = ";",
dec = ","
)
resultado_txtresultado_csvresultado_csv2Ao importar um arquivo, os argumentos usados na leitura devem ser compatíveis com os argumentos usados na exportação. Se você exportou com sep = ";", precisa importar considerando esse mesmo separador.
Além de exportar arquivos .txt e .csv, podemos salvar objetos no formato próprio do R.
.RDataArquivos .RData podem armazenar um ou mais objetos.
save(
dados_alfafa,
dados_producao,
file = "dados_aula3.RData"
)
list.files() [1] "alfafa.txt" "aula3_files"
[3] "aula3.html" "aula3.qmd"
[5] "aula3.rmarkdown" "clientes.csv"
[7] "dados_aula3.RData" "dados_brasil.csv"
[9] "estilo.css" "notas.RData"
[11] "notas.rds" "notas.txt"
[13] "producao.csv" "resultado_csv2.csv"
[15] "resultado_write_csv.csv" "resultado_write_csv2.csv"
[17] "resultado.csv" "resultado.rds"
[19] "resultado.txt" "resultado.xlsx"
[21] "rsconnect"
rm(dados_alfafa, dados_producao)
ls() [1] "alfafa" "dados_brasil" "dados_brasil_lido"
[4] "dados_csv" "dados_iris" "producao"
[7] "resultado" "resultado_csv" "resultado_csv2"
[10] "resultado_txt" "url_iris"
load("dados_aula3.RData")
ls() [1] "alfafa" "dados_alfafa" "dados_brasil"
[4] "dados_brasil_lido" "dados_csv" "dados_iris"
[7] "dados_producao" "producao" "resultado"
[10] "resultado_csv" "resultado_csv2" "resultado_txt"
[13] "url_iris"
Ao usar load(), objetos com o mesmo nome podem ser sobrescritos no ambiente global.
.rdsArquivos .rds armazenam um único objeto.
saveRDS(
object = resultado,
file = "resultado.rds"
)
resultado_recuperado <- readRDS("resultado.rds")
resultado_recuperadoA vantagem do .rds é que podemos escolher o nome do objeto no momento da leitura.
.RData, .rda e .rds.RData e .rda: armazenam um ou mais objetos..rds: armazena um único objeto.save() cria arquivos .RData ou .rda.load() lê arquivos .RData ou .rda.saveRDS() cria arquivos .rds.readRDS() lê arquivos .rds.Arquivos .xlsx são muito comuns, mas geralmente exigem pacotes adicionais.
Para utilizar as funções que trabalham com arquivos do Excel, é necessário instalar os pacotes readxl e writexl.
A instalação é feita apenas uma vez, utilizando a função install.packages():
install.packages("readxl")
install.packages("writexl")Após instalar, não é necessário instalar novamente.
Para usar as funções desses pacotes, podemos carregá-los com:
library(readxl)
library(writexl)Ou utilizar a forma direta com ::, como nos exemplos da aula:
readxl::read_excel("arquivo.xlsx")
writexl::write_xlsx(dados, "arquivo.xlsx")A instalação install.packages() deve ser feita apenas uma vez.
O carregamento library() deve ser feito sempre que iniciar uma nova sessão no R.
writexlif (requireNamespace("writexl", quietly = TRUE)) {
writexl::write_xlsx(
x = resultado,
path = "resultado.xlsx"
)
list.files()
} else {
message("O pacote writexl não está instalado.")
} [1] "alfafa.txt" "aula3_files"
[3] "aula3.html" "aula3.qmd"
[5] "aula3.rmarkdown" "clientes.csv"
[7] "dados_aula3.RData" "dados_brasil.csv"
[9] "estilo.css" "notas.RData"
[11] "notas.rds" "notas.txt"
[13] "producao.csv" "resultado_csv2.csv"
[15] "resultado_write_csv.csv" "resultado_write_csv2.csv"
[17] "resultado.csv" "resultado.rds"
[19] "resultado.txt" "resultado.xlsx"
[21] "rsconnect"
readxlif (
requireNamespace("readxl", quietly = TRUE) &&
file.exists("resultado.xlsx")
) {
resultado_excel <- readxl::read_excel("resultado.xlsx")
resultado_excel
} else {
message("Instale readxl e verifique se o arquivo resultado.xlsx existe.")
}Construam um script em R com as resoluções dos exercícios e salvem esse arquivo em uma pasta pessoal.
Use uma função para verificar o diretório de trabalho atual.
getwd()[1] "/Users/marcelocarlosribeiro/Documents/2026.1/EST 128/Aulas/Aula 3 "
Use uma função para listar os arquivos existentes no diretório de trabalho.
list.files() [1] "alfafa.txt" "aula3_files"
[3] "aula3.html" "aula3.qmd"
[5] "aula3.rmarkdown" "clientes.csv"
[7] "dados_aula3.RData" "dados_brasil.csv"
[9] "estilo.css" "notas.RData"
[11] "notas.rds" "notas.txt"
[13] "producao.csv" "resultado_csv2.csv"
[15] "resultado_write_csv.csv" "resultado_write_csv2.csv"
[17] "resultado.csv" "resultado.rds"
[19] "resultado.txt" "resultado.xlsx"
[21] "rsconnect"
Crie um dataframe chamado clientes com as colunas nome, idade e cidade. Depois exporte esse dataframe para um arquivo chamado clientes.csv.
clientes <- data.frame(
nome = c("Ana", "Bruno", "Carla"),
idade = c(25, 31, 28),
cidade = c("Ouro Preto", "Mariana", "Belo Horizonte")
)
write.table(
x = clientes,
file = "clientes.csv",
sep = ";",
quote = FALSE,
row.names = FALSE
)Importe o arquivo clientes.csv e salve o resultado no objeto clientes_lidos.
clientes_lidos <- read.table(
file = "clientes.csv",
header = TRUE,
sep = ";"
)
clientes_lidosVerifique a estrutura do objeto clientes_lidos.
str(clientes_lidos)'data.frame': 3 obs. of 3 variables:
$ nome : chr "Ana" "Bruno" "Carla"
$ idade : int 25 31 28
$ cidade: chr "Ouro Preto" "Mariana" "Belo Horizonte"
Crie um dataframe chamado notas com as colunas aluno, nota1 e nota2. Depois crie uma coluna chamada media.
notas <- data.frame(
aluno = c("Ana", "Bruno", "Carla"),
nota1 = c(8.0, 6.5, 9.0),
nota2 = c(7.5, 7.0, 8.5)
)
notas$media <- (notas$nota1 + notas$nota2) / 2
notasExporte o dataframe notas para um arquivo chamado notas.txt, separado por tabulação.
write.table(
x = notas,
file = "notas.txt",
sep = "\t",
quote = FALSE,
row.names = FALSE
).RData e .rdsSalve o objeto notas em um arquivo chamado notas.RData.
save(notas, file = "notas.RData")Salve o objeto notas em um arquivo chamado notas.rds.
saveRDS(
object = notas,
file = "notas.rds"
)Leia o arquivo notas.rds e salve o resultado em um novo objeto chamado notas_recuperadas.
notas_recuperadas <- readRDS("notas.rds")
notas_recuperadasImportar e exportar dados é uma etapa fundamental da análise de dados. Antes de analisar uma base, precisamos garantir que ela foi lida corretamente pelo R.