Импорт и анализ текстового файла с пробелами / NA в R

Я хотел бы разобрать этот текстовый файл:

https://www2.census.gov/programs-surveys/saipe/datasets/1995/1995-state-and-county/est95all.dat

Самая большая проблема заключается в том, что первые две строки содержат информацию, которой нет в большинстве строк. По сути, эти значения должны быть NA в последующих столбцах.

Я немного возился с library(readr), и лучшее простое решение:

DT <- read_table2("https://www2.census.gov/programs-surveys/saipe/datasets/1995/1995-state-and-county/est95all.dat", 
col_names = FALSE, skip = 2)

Который просто пропускает первые две строки, а затем правильно анализирует большинство строк, что приводит к:

# A tibble: 3,192 x 26
   X1       X2    X3 X4    X5       X6 X7    X8       X9 X10   X11     X12 X13   X14     X15 X16   X17     X18 X19   X20     X21   X22   X23 X24      X25    X26  
   <chr> <dbl> <dbl> <chr> <chr> <dbl> <chr> <chr> <dbl> <chr> <chr> <dbl> <chr> <chr> <dbl> <chr> <chr> <dbl> <chr> <chr> <dbl> <dbl> <dbl> <chr>    <chr>  <chr>
 1 01        1  5471 4391  6550   13.4 10.8  16.1   2352 1885  2820   20.1 16.1  24.1   1513 1207  1819   17.9 14.3  21.5  34842 31780 37888 Autauga  County AL   
 2 01        3 15494 12415 18573  12.4 9.9   14.9   6151 4886  7416   19.3 15.3  23.3   3927 3098  4756   17.1 13.5  20.7  35014 31981 38031 Baldwin  County AL   
 3 01        5  6423 5153  7692   24.9 20.0  29.8   2564 2049  3078   35.2 28.1  42.2   1716 1366  2066   32.4 25.8  39.1  24423 21343 27485 Barbour  County AL   
 4 01        7  3313 2662  3964   18.1 14.5  21.7   1338 1071  1605   26.2 21.0  31.4    908 722   1094   24.2 19.2  29.1  26651 23548 29737 Bibb     County AL   
 5 01        9  6041 4864  7219   13.7 11.0  16.4   2248 1794  2701   20.6 16.5  24.8   1442 1144  1740   18.4 14.6  22.2  30584 27559 33593 Blount   County AL   
 6 01       11  3524 2817  4231   33.7 26.9  40.5   1448 1149  1746   44.1 35.0  53.2    966 764   1168   41.9 33.1  50.6  19063 15950 22158 Bullock  County AL   
 7 01       13  5540 4436  6644   25.4 20.4  30.5   2347 1865  2828   36.8 29.2  44.3   1576 1244  1908   33.5 26.4  40.5  21918 18822 24998 Butler   County AL   
 8 01       15 20008 16185 23831  17.5 14.2  20.8   7333 5889  8776   25.4 20.4  30.4   4557 3639  5475   21.7 17.3  26.0  27265 24408 30106 Calhoun  County AL   
 9 01       17  6828 5478  8177   18.4 14.7  22.0   2621 2086  3156   27.8 22.1  33.5   1680 1329  2031   24.2 19.2  29.3  25571 22477 28648 Chambers County AL   
10 01       19  3420 2725  4116   15.8 12.6  19.1   1128 893   1363   22.3 17.7  27.0    708 557   859    18.8 14.8  22.8  26719 23647 29775 Cherokee County AL   
# ... with 3,182 more rows

Однако это приводит к двум проблемам, которые я не могу решить.

  1. Проблема первых двух строк (см. ссылку, а не данные), которая повторяется в других строках.
  2. Округа часто состоят из нескольких названий, в результате чего округа распределяются по нескольким столбцам.

Есть ли способ справиться с этими проблемами?

Желаемый результат - это просто данные, как они видны в ссылке

Данные, на которые вы указали, не разделены. Это формат с фиксированной шириной. Вместо этого вы должны использовать read_fwf . Существует описание формата файла, доступного для этого файла: www2.census.gov/programs-surveys/saipe/technical-documentati‌​on/…

MrFlick 24.12.2020 09:13

@MrFlick Спасибо! Какая ужасная работа, но она работает... И я думаю, что в любом случае это самый безопасный вариант. Похоже, должен быть какой-то более быстрый вариант, ха-ха.

Tom 24.12.2020 09:54

@MrFlick Я вижу, что операция удаляет десятичные точки. Есть ли способ предотвратить это?

Tom 24.12.2020 10:07

Этого не должно быть. Вы уверены, что у вас правильные позиции полей? Значения просто округляются во время печати? Может быть, покажите код, который вы на самом деле используете.

MrFlick 24.12.2020 10:09

Это вопрос округления, вы правы. Извини. Еще раз спасибо!

Tom 24.12.2020 10:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот вариант извлечения информации из найденной кодовой книги @MrFlick. Изучив его, мы видим, что все позиции имеют формат dd- dd texttext. Мы читаем его, используя readLines, и подставляем его к строкам с этими форматами. Мы заменяем "-" двумя пробелами, используя gsub, и используем strsplit, что дает нам по три столбца в каждом — положение начала/конца и имя.

cbl <- "https://www2.census.gov/programs-surveys/saipe/technical-documentation/file-layouts/state-county/1995-estimate-layout.txt"
cb <- readLines(cbl)
cb <- trimws(gsub("\\t|(?<=\\d)-", "  ", cb[grep("\\t\\d+-", cb)], perl=TRUE))
cb <- strsplit(cb, "\\s{2,}")

Теперь конвертируем в матрицу и вычисляем colDiffs; добавление 2 дает нам желаемую длину w.

w <- matrixStats::colDiffs(type.convert(sapply(cb, `[`, 1:2))) + 2

Теперь мы можем использовать read.fwf, применяя w и называя переменные с помощью третьего столбца кодовой книги после небольшой очистки с помощью make.names.

ll <- "https://www2.census.gov/programs-surveys/saipe/datasets/1995/1995-state-and-county/est95all.dat"
tt <- setNames(read.fwf(ll, widths=w, header=F), lapply(cb, `[`, 3))

Результат

Вот результат, надеюсь все в порядке.

head(tt)
# FIPS.State.code FIPS.county.code...0.for.US.or.state.level.records.
# 1               0                                                   0
# 2               1                                                   0
# 3               1                                                   1
# 4               1                                                   3
# 5               1                                                   5
# 6               1                                                   7
# Estimate.of.people.of.all.ages.in.poverty X90..confidence.interval.lower.bound.of
# 1                                  36424609                               35534124 
# 2                                    752097                                 723535 
# 3                                      5471                                   4391 
# 4                                     15494                                  12415 
# 5                                      6423                                   5153 
# 6                                      3313                                   2662 
# X90..confidence.interval.upper.bound.of Estimated.percent.of.people.of.all.ages.in.poverty
# 1                               37315094                                  13.800000000000001
# 2                                 780659                                  17.600000000000001
# 3                                   6550                                  13.400000000000000
# 4                                  18573                                  12.400000000000000
# 5                                   7692                                  24.899999999999999
# 6                                   3964                                  18.100000000000001
# X90..confidence.interval.lower.bound.of X90..confidence.interval.upper.bound.of
# 1                                   13.5                                    14.1 
# 2                                   17.0                                    18.3 
# 3                                   10.8                                    16.1 
# 4                                    9.9                                    14.9 
# 5                                   20.0                                    29.8 
# 6                                   14.5                                    21.7 
# Estimate.of.people.age.0 X90..confidence.interval.lower.bound.of
# 1                 14665019                               14189284 
# 2                   291046                                 275169 
# 3                     2352                                   1885 
# 4                     6151                                   4886 
# 5                     2564                                   2049 
# 6                     1338                                   1071 
# X90..confidence.interval.upper.bound.of Estimated.percent.of.people.age.0
# 1                               15140754                 20.800000000000001
# 2                                 306922                 26.399999999999999
# 3                                   2820                 20.100000000000001
# 4                                   7416                 19.300000000000001
# 5                                   3078                 35.200000000000003
# 6                                   1605                 26.199999999999999
# X90..confidence.interval.lower.bound.of X90..confidence.interval.upper.bound.of
# 1                                   20.1                                    21.5 
# 2                                   25.0                                    27.8 
# 3                                   16.1                                    24.1 
# 4                                   15.3                                    23.3 
# 5                                   28.1                                    42.2 
# 6                                   21.0                                    31.4 
# Estimate.of.related.children.age.5 X90..confidence.interval.lower.bound.of.estimate.of
# 1                            9306018                                            8908791 
# 2                             187857                                             176899 
# 3                               1513                                               1207 
# 4                               3927                                               3098 
# 5                               1716                                               1366 
# 6                                908                                                722 
# X90..confidence.interval.upper.bound.of.estimate.of
# 1                                            9703245 
# 2                                             198815 
# 3                                               1819 
# 4                                               4756 
# 5                                               2066 
# 6                                               1094 
# Estimated.percent.of.related.children.age.5
# 1                          18.699999999999999
# 2                          23.800000000000001
# 3                          17.899999999999999
# 4                          17.100000000000001
# 5                          32.399999999999999
# 6                          24.199999999999999
# X90..confidence.interval.lower.bound.of.estimate.of.percent
# 1                                                       17.9 
# 2                                                       22.4 
# 3                                                       14.3 
# 4                                                       13.5 
# 5                                                       25.8 
# 6                                                       19.2 
# X90..confidence.interval.upper.bound.of.estimate.of.percent
# 1                                                       19.5 
# 2                                                       25.2 
# 3                                                       21.5 
# 4                                                       20.7 
# 5                                                       39.1 
# 6                                                       29.1 
# Estimate.of.median.household.income X90..confidence.interval.lower.bound.of
# 1                               34076                                   33752
# 2                               27357                                   25953
# 3                               34842                                   31780
# 4                               35014                                   31981
# 5                               24423                                   21343
# 6                               26651                                   23548
# X90..confidence.interval.upper.bound.of Estimate.of.people.under.age.5.in.poverty
# 1                                   34400                                   4816366
# 2                                   28761                                     96545
# 3                                   37888                                        NA
# 4                                   38031                                        NA
# 5                                   27485                                        NA
# 6                                   29737                                        NA
# X90..confidence.interval.lower.bound.of X90..confidence.interval.upper.bound.of
# 1                                 4522061                                 5110671
# 2                                   84990                                  108101
# 3                                      NA                                      NA
# 4                                      NA                                      NA
# 5                                      NA                                      NA
# 6                                      NA                                      NA
# Estimated.percent.of.people.under.age.5.in.poverty X90..confidence.interval.lower.bound.of
# 1                                 24.199999999999999                      22.699999999999999
# 2                                 31.600000000000001                      27.800000000000001
# 3                                                 NA                                      NA
# 4                                                 NA                                      NA
# 5                                                 NA                                      NA
# 6                                                 NA                                      NA
# X90..confidence.interval.upper.bound.of                           State.or.county.name
# 1                      25.600000000000001 United States                                 
# 2                      35.399999999999999 Alabama                                       
# 3                                      NA Autauga County                                
# 4                                      NA Baldwin County                                
# 5                                      NA Barbour County                                
# 6                                      NA Bibb County                                   
# Two.letter.Postal.State.abbreviation
# 1                                   US
# 2                                   AL
# 3                                   AL
# 4                                   AL
# 5                                   AL
# 6                                   AL

Конечно, имена столбцов слишком длинные и запутанные, но я оставляю это на ваше усмотрение ;)

Отлично! Большое спасибо! Когда я запускаю ваш код, в последней строке что-то идет не так: Error in if (header) { : argument is not interpretable as logical Я тоже получаю предупреждение, но я думаю, что это не должно быть проблемой In addition: Warning message: In if (header) { : the condition has length > 1 and only the first element will be used

Tom 24.12.2020 10:17

@Tom Хм, просто перезапустил код в новом сеансе, используя R 4.0.3, без загрузки дополнительных пакетов и без предупреждений/ошибок, у меня работает!

jay.sf 24.12.2020 10:22

Спасибо, я только что проверил. Он также работает без каких-либо библиотек, загруженных в 3.6.1. Итак, я предполагаю, что у меня конфликт библиотек. Большое вам спасибо за вашу помощь!

Tom 24.12.2020 10:24

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