Estou tentando carregar este conjunto de dados formatado feio em minha sessão R: http://www.cpc.ncep.noaa.gov/data/indices/wksst8110.for
Weekly SST data starts week centered on 3Jan1990
Nino1+2 Nino3 Nino34 Nino4
Week SST SSTA SST SSTA SST SSTA SST SSTA
03JAN1990 23.4-0.4 25.1-0.3 26.6 0.0 28.6 0.3
10JAN1990 23.4-0.8 25.2-0.3 26.6 0.1 28.6 0.3
17JAN1990 24.2-0.3 25.3-0.3 26.5-0.1 28.6 0.3
Até agora, posso ler as linhas com
x = readLines(path)
Mas o arquivo mistura 'espaço em branco' com '-' como separadores, e eu não sou um especialista em regex. Agradeço qualquer ajuda em transformar isso em um quadro de dados R bonito e limpo. obrigado!
r
fixed-width
Fernando
fonte
fonte
read.fwf
para ler dados formatados de largura fixa.Respostas:
Este é um arquivo de largura fixa. Use
read.fwf()
para ler:Atualizar
O pacote
readr
(lançado em abril de 2015) oferece uma alternativa simples e rápida.Comparação de velocidade:
readr::read_fwf()
foi ~ 2x mais rápido queutils::read.fwf ()
.fonte
readr::fwf_empty
que tentará adivinhar as larguras para você. Os exemplos dereadr::read_fwf
mostra o uso dereadr::fwf_empty
.Outra forma de determinar larguras ...
O -1 no argumento de larguras diz que há uma coluna de um caractere que deve ser ignorada, o -5 no argumento de larguras diz que há uma coluna de cinco caracteres que deve ser ignorada, da mesma forma ...
ref: https://www.inkling.com/read/r-cookbook-paul-teetor-1st/chapter-4/recipe-4-6
fonte
Em primeiro lugar, essa pergunta vem diretamente de um curso "Obter dados e limpar" do Coursera da Leeks. Embora haja outra parte da questão, a parte difícil é ler o arquivo.
Dito isso, o curso é voltado principalmente para o aprendizado.
Eu odeio o procedimento de largura fixa de R. É lento e para um grande número de variáveis, muito rapidamente se torna uma dor negar certas colunas, etc.
Eu acho que é mais fácil de usar
readLines()
e, a partir daí,substr()
fazer suas variáveisfonte
mydata <- data.frame(var4 = substr(x,29,32))
se você só precisasse da quarta coluna de dados. Além disso, para usuários do Windows, o Notepad ++ com o plug-in TextFX fornecerá uma régua de caracteres simples e simples para que você possa descobrir o que inserir nos valores de início e paradasubstr
. Observe, entretanto, que o valor de parada é mais um do que a posição do último caractere que você deseja preservar.Agora você pode usar a
read_fwf()
função noreadr
pacote de Hadley Wickham .Uma grande melhoria de desempenho é esperada, em comparação com a base
read.fwf()
.fonte
Documento aqui a lista de alternativas para leitura de arquivos de largura fixa em R, além de fornecer alguns benchmarks para qual é o mais rápido.
Minha abordagem preferida é combinar
fread
comstringi
; é competitivo por ser a abordagem mais rápida e tem o benefício adicional (IMO) de armazenar seus dados comodata.table
:Observe que
fread
remove automaticamente os espaços em branco à esquerda e à direita - às vezes, isso é indesejável e, nesse caso, definastrip.white = FALSE
.Também poderíamos ter começado com um vetor de larguras de coluna
ww
fazendo:E poderíamos ter escolhido quais colunas excluir de forma mais robusta, usando índices negativos como:
Em seguida, substitua
col_ends$beg[ii]
porabs(col_ends$beg[ii])
e na próxima linha:Por último, se quiser que os nomes das colunas também sejam lidos de maneira programática, você pode limpar com
readLines
:(observe que combinar esta etapa com
fread
exigiria a criação de uma cópia da tabela a fim de remover a linha do cabeçalho e, portanto, seria ineficiente para grandes conjuntos de dados)fonte
Não sei nada sobre R, mas posso fornecer uma regex que corresponderá a essas linhas:
fonte