Что не так с этим набором данных?

Я изучаю 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 Функция может успешно прочитать файл.

Другие вопросы по тегам