Что не так с этим набором данных?
Я изучаю R и пробую этот набор данных. http://ww2.amstat.org/publications/jse/datasets/airport.dat.txt
к сожалению, используя
ap <- read.table("http://ww2.amstat.org/publications/jse/datasets/airport.dat.txt")
действительно дает ошибочные результаты. Файл представляет собой "входной файл произвольного формата", как описано здесь. ( http://data.princeton.edu/R/readingData.html). Исходя из примеров, приведенных на этой странице, мой простой код должен работать... но это не так и приводит к ломаным строкам и плохим записям. В чем дело?
Спасибо.
2 ответа
Вы должны использовать read.fwf
и указать widths
вот так:
read.fwf("http://ww2.amstat.org/publications/jse/datasets/airport.dat.txt",
widths=c(21,21,7,7,9,10,15))
V1 V2 V3 V4 V5 V6 V7
1 HARTSFIELD INTL ATLANTA 285693 288803 22665665 165668.76 93039.48
2 BALTO/WASH INTL BALTIMORE 73300 74048 4420425 18041.52 19722.93
3 LOGAN INTL BOSTON 114153 115524 9549585 127815.09 29785.72
4 DOUGLAS MUNI CHARLOTTE 120210 121798 7076954 36242.84 15399.46
Чтение файла с фиксированной шириной - это всегда сложная задача, поскольку пользователям необходимо определить ширину каждого столбца. Чтобы выполнить такую задачу, я использую функции из readr
чтобы сделать процесс проще.
Основная функция для чтения файла фиксированной ширины read_fwf
, Кроме того, есть функция под названием fwf_empty
может помочь пользователям "угадать" ширину столбца. Но эта функция не всегда правильно определяет ширину столбца. Вот пример.
# Load package
library(readr)
# Read the data
filepath <- "http://ww2.amstat.org/publications/jse/datasets/airport.dat.txt"
# Guess based on position of empty columns
col_pos <- fwf_empty(filepath)
# Read the data
dat <- read_fwf(filepath, col_positions = col_pos)
# Check the data frame
head(dat)
# A tibble: 6 × 6
X1 X2 X3 X4 X5 X6
<chr> <chr> <int> <int> <dbl> <dbl>
1 HARTSFIELD INTL ATLANTA 285693 288803 22665665 165668.76 93039.48
2 BALTO/WASH INTL BALTIMORE 73300 74048 4420425 18041.52 19722.93
3 LOGAN INTL BOSTON 114153 115524 9549585 127815.09 29785.72
4 DOUGLAS MUNI CHARLOTTE 120210 121798 7076954 36242.84 15399.46
5 MIDWAY CHICAGO 64465 66389 3547040 4494.78 4485.58
6 O'HARE INTL CHICAGO 322430 332338 25636383 300463.80 140359.38
fwf_empty
выполняет довольно хорошую работу, чтобы идентифицировать все столбцы, кроме столбцов 2 и 3. Предполагается, что они из одного столбца. Поэтому нам нужна дополнительная работа.
Выход из fwf_empty
список из 4 элементов, показывающий идентифицированную начальную и конечную позиции, имена пропущенных и столбцов. Мы должны обновить начальную и конечную позиции, чтобы учесть существование столбцов 2 и 3.
# Extract the begin position
Begin <- col_pos$begin
# Extract the end position
End <- col_pos$end
# Update the position information
Begin <- c(Begin[1:2], 43, Begin[3:6])
End <- c(End[1], 42, End[2:6])
# Update col_pos
col_pos$begin <- Begin
col_pos$end <- End
col_pos$col_names <- paste0("X", 1:7)
Теперь мы снова читаем данные.
dat2 <- read_fwf(filepath, col_positions = col_pos)
head(dat2)
# A tibble: 6 × 7
X1 X2 X3 X4 X5 X6 X7
<chr> <chr> <int> <int> <int> <dbl> <dbl>
1 HARTSFIELD INTL ATLANTA 285693 288803 22665665 165668.76 93039.48
2 BALTO/WASH INTL BALTIMORE 73300 74048 4420425 18041.52 19722.93
3 LOGAN INTL BOSTON 114153 115524 9549585 127815.09 29785.72
4 DOUGLAS MUNI CHARLOTTE 120210 121798 7076954 36242.84 15399.46
5 MIDWAY CHICAGO 64465 66389 3547040 4494.78 4485.58
6 O'HARE INTL CHICAGO 322430 332338 25636383 300463.80 140359.38
На этот раз read_fwf
Функция может успешно прочитать файл.