2016-10-28 7 views
1

Я читаю текстовый файл с this webpage в R. Если я читаю эти данные с read.table данные разобран правильно и получить данные для всех 12 месяцев:Reading: read.table против read_table

url <- "http://academic.udayton.edu/kissock/http/Weather/gsod95-current/OHCINCIN.txt" 

temp_df1 <- read.table(url, 
         col.names = c("Month", "Day", "Year", "Avg_Temp"), 
         na = "-99") 

head(temp_df1) 
Month Day Year Avg_Temp 
1  1 1 1995  41.1 
2  1 2 1995  22.2 
3  1 3 1995  22.8 
4  1 4 1995  14.9 
5  1 5 1995  9.5 
6  1 6 1995  23.8 

unique(temp_df1$Month) 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 

Однако, если я прочитаю эти данные с помощью read_table, сначала появится, что он правильно разобран; однако коды с двойными цифрами (10, 11, 12) разделяются так, что анализируется только первая цифра.

temp_df2 <- read_table(url, 
         col_names = c("Month", "Day", "Year", "Avg_Temp"), 
         na = "-99") 

head(temp_df2) 
# A tibble: 6 × 4 
    Month Day Year Avg_Temp 
    <int> <int> <int> <dbl> 
1  1  1 1995  41.1 
2  1  2 1995  22.2 
3  1  3 1995  22.8 
4  1  4 1995  14.9 
5  1  5 1995  9.5 
6  1  6 1995  23.8 

unique(temp_df2$Month) 
[1] 1 2 3 4 5 6 7 8 9 

Размеры данных одинаковы; однако я не могу понять, как импортировать данные с read_table, чтобы сохранить полный код Month.

dim(temp_df1) 
[1] 7963 4 

dim(temp_df2) 
[1] 7963 4 
+2

Я думаю, что это имеет отношение к 'read_table' неоспоримым _" похожи to read.table, но вместо синтаксического анализа, как файл, ограниченный произвольным количеством пробелов, он сначала находит пустые столбцы и затем анализирует, как файл фиксированной ширины. "_. (См. '? Read_table'). Например, если вы измените порядок строк (и, таким образом, разместите месяц с длиной 2), он будет работать так, как ожидалось. – lukeA

+0

Действительно. Фактически это было [зарегистрировано как ошибка] (https://github.com/tidyverse/readr/issues/518) – yeedle

+0

Данные на самом деле являются фиксированными; числа выравниваются влево, а не справа, что, вероятно, вызывает проблему. Вы можете прочитать его явно как фиксированную ширину: 'temp_df2 <- read_fwf (url, col_positions = fwf_empty (url, col_names = c (« Месяц »,« День »,« Год »,« Авг_Темп »), skip = 200) , na = "-99") ' – alistaire

ответ

2

read_table не работает, как ожидается, в связи с проблемой, упомянутой в comments по LukeA. Вместо этого вы должны использовать функцию read_fwf и указать длины полей, чтобы избежать этой проблемы.

temp_df2 <- read_fwf(url, 
    col_positions = fwf_widths(c(14, 14, 13, 4), col_names = c("Month", "Day", "Year", "Avg_Temp"))) 

Имейте в виду, что для read_fwf, col_names передается в качестве аргумента fwf_widths и не read_fwf себя.

Кроме того, с read_fwf вы даже можете пропустить шаг, и разобрать дату как Date объекта в то время как вы читаете это в:

temp_df2 <- read_fwf(url, 
        col_positions = fwf_widths(c(41, 4), 
              col_names = c("date", "Avg_Temp")), 
        col_types = cols(col_date("%m %d %Y"), col_number()))