Menu

Ler Arquivos CSV no R (read.csv e read_csv)

Como importar arquivos CSV para o R com read.csv() - os argumentos que importam, a armadilha do diretório de trabalho que causa a maioria das falhas e quando readr::read_csv vale a pena.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

read.csv() Transforma um Arquivo CSV em um Data Frame

Ler um CSV no R é uma única chamada de função, embutida na linguagem - nenhum pacote é necessário:

sales <- read.csv("sales.csv")

read.csv() lê o arquivo, usa a primeira linha como nomes das colunas, adivinha um tipo para cada coluna e retorna um data frame. É toda a história para um arquivo bem-comportado.

Você pode vê-lo funcionando sem arquivo nenhum, porque read.csv() também aceita texto CSV bruto pelo argumento text - o mesmo parser, alimentado com uma string em vez de um nome de arquivo:

str() é a primeira coisa a rodar em qualquer coisa que você importa: ele mostra cada coluna com o tipo adivinhado. Aqui name entrou como character, score como integer e passed como logical - tudo adivinhado a partir dos valores. Para uma conferida visual rápida, head(students) mostra as primeiras linhas e nrow(students) as conta. Se uma coluna que você esperava ser numérica aparece como chr, algo nessa coluna não é um número - um comentário perdido, um "N/A", um separador de milhar - e esse é o momento de corrigir, não três gráficos depois.

Os Argumentos Que Importam

read.csv() tem dezenas de parâmetros; você vai usar uns cinco.

header - se a primeira linha contém os nomes das colunas. O padrão é TRUE. Se o seu arquivo começa direto com os dados, passe header = FALSE e o R nomeia as colunas V1, V2, ...

sep - o separador de campos, padrão ",". Boa parte da Europa escreve CSVs com ponto e vírgula como separador, porque a vírgula é o separador decimal por lá. O R traz uma variante pré-configurada exatamente para isso: read.csv2() usa sep = ";" e dec = ",":

As alturas saem como números de verdade - read.csv2 sabia que 1,63 significava um vírgula sessenta e três. Se você tivesse usado o read.csv comum nesse arquivo, teria uma coluna mutilada, porque nada divide corretamente uma vírgula-que-é-decimal.

na.strings - quais strings contam como ausentes. Por padrão apenas "NA" vira valor ausente. Exports reais escrevem dados faltantes como células vazias, "missing", "-", "NULL" - e a menos que você as declare, elas chegam como texto e arrastam a coluna inteira para character:

Com o na.strings certo, os vazios viram NAs de verdade e score continua numérica. Sem ele, "missing" é só uma palavra, e a coluna é texto.

skip - linhas a ignorar antes de os dados começarem. Exports adoram colocar uma ou duas linhas de título acima da tabela de verdade; skip = 2 pula por cima delas.

colClasses - força os tipos das colunas em vez de deixar o R adivinhar. A vítima clássica é qualquer coisa com zeros à esquerda - CEPs, telefones, IDs de produto - que o adivinhador do R lê como números, destruindo os zeros:

00501 virou 501. Os dados estavam corretos no arquivo e errados no R, silenciosamente. colClasses = c("integer", "character") diz ao parser o que cada coluna é, na ordem, e os zeros sobrevivem.

Um argumento de que você não precisa mais: stringsAsFactors. Durante a maior parte da história do R, read.csv() convertia toda coluna de texto em factor a menos que você dissesse o contrário, o que causou uma quantidade enorme de confusão. Desde o R 4.0 o padrão é FALSE - texto continua texto. Você ainda verá stringsAsFactors = FALSE espalhado por tutoriais mais antigos; em um R atual é inofensivo, porém redundante.

Caminhos de Arquivo: A Razão nº 1 de o read.csv Falhar

O erro que todo aprendiz de R encontra na primeira semana:

Error in file(file, "rt") : cannot open the connection
In addition: Warning message:
cannot open file 'sales.csv': No such file or directory

O arquivo existe - você está olhando para ele no gerenciador de arquivos. Mas o R não está olhando para lá. Um nome de arquivo puro como "sales.csv" é resolvido em relação ao diretório de trabalho do R, e ele geralmente não é a pasta onde seu arquivo está. Duas linhas diagnosticam:

getwd()                    # where R is actually looking
file.exists("sales.csv")   # FALSE means the path is wrong, full stop

Se file.exists() diz FALSE, nenhuma quantidade de re-execução vai ajudar - corrija o caminho. Ou informe o caminho completo (read.csv("C:/Users/ada/data/sales.csv") - barras normais funcionam também no Windows, e são mais seguras que barras invertidas) ou mova o diretório de trabalho do R para a pasta dos dados com setwd(). O que é o diretório de trabalho, como projetos o gerenciam e por que setwd() em scripts é malvisto está em diretório de trabalho.

Faça de file.exists() um reflexo. Ele converte "falha misteriosa de importação" em "erro de digitação num caminho" em um segundo.

Lendo um CSV Direto de uma URL

read.csv() aceita uma URL em qualquer lugar em que aceita um nome de arquivo, e baixa o arquivo para você:

url <- "https://raw.githubusercontent.com/mwaskom/seaborn-data/master/penguins.csv"
penguins <- read.csv(url)
str(penguins)

Isso é prático para tutoriais e datasets públicos - sem etapa de download, sem problemas de caminho. O preço é que seu script agora depende da rede e de aquela URL continuar viva; para qualquer coisa que você vá rodar de novo com frequência, baixe uma vez e leia a cópia local.

readr::read_csv - a Alternativa Mais Rápida e Mais Falante

O tidyverse traz seu próprio leitor de CSV no pacote readr: read_csv() (underscore, não ponto). Vale conhecer porque a maior parte do código R moderno que você vai ler o utiliza:

install.packages("readr")   # once
library(readr)              # every session

flights <- read_csv("flights.csv")

As diferenças práticas em relação ao read.csv():

  • Velocidade - visivelmente mais rápido em arquivos com centenas de milhares de linhas.
  • Ele retorna um tibble - um data frame modernizado que imprime uma prévia compacta em vez de inundar o console.
  • Ele reporta seus palpites - após a leitura, imprime o tipo detectado de cada coluna, de modo que uma coluna interpretada como character quando você esperava números fica visível de imediato em vez de virar surpresa depois.
  • Ele nunca mutila nomes de colunas - read.csv() reescreve um cabeçalho como first name para first.name; read_csv() o mantém como está.

Para um arquivo pequeno, qualquer uma das funções serve. Recorra ao read_csv() quando os arquivos crescem ou quando o restante do seu script já é tidyverse de qualquer forma. Tudo o que foi dito acima sobre caminhos, separadores (existe read_csv2() também) e strings de valores ausentes (na =) se aplica com nomes de argumentos levemente diferentes.

Quando terminar de analisar, a viagem de volta - exportar seus resultados para um arquivo - é o write.csv.

O Que Você Leva

  • df <- read.csv("file.csv") lê um CSV para um data frame; confira imediatamente com str() e head().
  • read.csv(text = "...") interpreta uma string CSV diretamente - ótimo para experimentos e exemplos pequenos.
  • Os argumentos que valem o que pesam: header, sep (ou read.csv2 para ponto e vírgula), na.strings, skip, colClasses.
  • "Cannot open file" significa que o diretório de trabalho não é onde você pensa que é - getwd() e file.exists() resolvem na hora.
  • readr::read_csv() é a versão tidyverse mais rápida: tibbles, tipos de coluna reportados, nomes intocados.

A seguir: arquivos que não são texto puro - lendo planilhas do Excel com o pacote readxl.

Perguntas frequentes

Como se lê um arquivo CSV no R?

Com read.csv("file.csv") - ele é embutido, nenhum pacote é necessário. Ele retorna um data frame com uma coluna por coluna do CSV, usando a primeira linha como nomes das colunas. Atribua o resultado a uma variável: df <- read.csv("sales.csv"), e depois confira com str(df) e head(df).

Por que o read.csv diz 'cannot open file: No such file or directory'?

O R está procurando o arquivo em relação ao seu diretório de trabalho, que provavelmente não é a pasta onde o arquivo está. Rode getwd() para ver onde o R está procurando e file.exists("file.csv") para confirmar a falha. Corrija com um caminho completo, ou definindo o diretório de trabalho para a pasta do arquivo.

Qual é a diferença entre read.csv e read_csv no R?

read.csv() é do R base - sempre disponível, retorna um data frame comum. read_csv() vem do pacote readr - é mais rápido em arquivos grandes, retorna um tibble, nunca mexe nos nomes das suas colunas e imprime os tipos de coluna que adivinhou, para você flagrar parses errados na hora. Para arquivos pequenos, qualquer um serve; para arquivos grandes ou pipelines tidyverse, use read_csv().

Como se lê um CSV separado por ponto e vírgula no R?

Use read.csv2("file.csv") - é o read.csv pré-configurado para a convenção europeia: ponto e vírgula como separador e vírgula como separador decimal. Ou passe sep = ";" (e dec = "," se necessário) ao read.csv() comum.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR