2017-01-24 2 views
1

Я хочу прочитать в таблице из файла NOAA, размещенного в Интернете. Файл представляет собой список станций в разных городах. У меня проблемы с чтением данных. Столбцы, похоже, не разделены последовательно. Это означает, что я должен превратить опцию fill в true, которая заканчивается тем, что несколько городов слов заканчиваются в разных столбцах. Это явно не то, что я хочу, но я не вижу решения, которые могут его исправить. Есть ли способ указать, может быть, последние несколько столбцов, которые нужно читать вместе, как один столбец? Или, может быть, мне не следует использовать read.table и, возможно, что-то еще? Любая помощь приветствуется!read.table с переменными столбцами

Код приведен ниже.

url <- "ftp://ftp.ncdc.noaa.gov/pub/data/normals/1981-2010/station-inventories/temp-inventory.txt" 

stations <- read.table(url, header=FALSE, skip=2, fill=TRUE, nrows = 5, 
      col.names = c("ID","lat","lon","UNK","State","City","UNK2","UNK3","UNK4") 
      ) 
stations 

      ID  lat  lon UNK State  City  UNK2  UNK3   UNK4 
1 CQC00914080 15.2136 145.7497 252.1 MP CAPITOL  HILL   1 TRADITIONAL 
2 CQC00914801 14.1717 145.2428 179.2 MP  ROTA   AP  91221 TRADITIONAL 
3 FMC00914395 5.3544 162.9533 2.1 FM KOSRAE  91355 TRADITIONAL 
4 FMC00914419 5.5167 153.8167 1.5 FM LUKUNOCH TRADITIONAL    
5 FMC00914446 9.6053 138.1786 14.9 FM  MAAP TRADITIONAL    

оригинальный источник с соответствующими линиями заключается в следующем:

CQC00914080 15.2136 145.7497 252.1 MP CAPITOL HILL 1        TRADITIONAL 
CQC00914801 14.1717 145.2428 179.2 MP ROTA AP        91221 TRADITIONAL 
FMC00914395 5.3544 162.9533 2.1 FM KOSRAE         91355 TRADITIONAL 
FMC00914419 5.5167 153.8167 1.5 FM LUKUNOCH          TRADITIONAL 
FMC00914446 9.6053 138.1786 14.9 FM MAAP           TRADITIONAL 
+1

Похоже, файл фиксированной ширины для меня - см. '? Read.fwf' – thelatemail

+0

Я раньше этого не видел, но это очень полезно. Спасибо за совет! –

ответ

1

Он отлично работает с read_table из пакета readr:

readr::read_table(url, skip=2, n_max = 5,col_names=FALSE) 

cols(
    X1 = col_character(), 
    X2 = col_double(), 
    X3 = col_double(), 
    X4 = col_double(), 
    X5 = col_character(), 
    X6 = col_character(), 
    X7 = col_character(), 
    X8 = col_character(), 
    X9 = col_integer(), 
    X10 = col_character() 
) 
# A tibble: 5 × 10 
      X1  X2  X3 X4 X5    X6 X7 X8 X9   X10 
     <chr> <dbl> <dbl> <dbl> <chr>   <chr> <chr> <chr> <int>  <chr> 
1 CQC00914080 15.2136 145.7497 252.1 MP CAPITOL HILL 1    NA TRADITIONAL 
2 CQC00914801 14.1717 145.2428 179.2 MP  ROTA AP    91221 TRADITIONAL 
3 FMC00914395 5.3544 162.9533 2.1 FM   KOSRAE    91355 TRADITIONAL 
4 FMC00914419 5.5167 153.8167 1.5 FM  LUKUNOCH    NA TRADITIONAL 
5 FMC00914446 9.6053 138.1786 14.9 FM   MAAP    NA TRADITIONAL 
+0

Иногда я чувствую себя настоящим идиотом. Спасибо тебе друг! –

2

Похож фиксированная ширина файла, который может обрабатываться надлежащим образом с использованием ?read.fwf. Вот полная линия, которая, кажется, работает, чтобы импортировать файл:

read.fwf(url, widths=c(11,9,10,7,4,31,3,10,13), strip.white=TRUE, comment.char="") 

comment.char="" необходимо, потому что есть # символы в текстовом файле, которые интерпретируются как символы комментария Р. Это делает некоторые линии выдаст ошибку так как он не находит все столбцы, в которых он нуждается.

+0

Мне тоже нравится это решение, даже если для этого требуется небольшое количество дополнительной работы. Еще раз спасибо! –

Смежные вопросы