Я хотел бы разобрать этот текстовый файл:
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
Однако это приводит к двум проблемам, которые я не могу решить.
Есть ли способ справиться с этими проблемами?
Желаемый результат - это просто данные, как они видны в ссылке
@MrFlick Спасибо! Какая ужасная работа, но она работает... И я думаю, что в любом случае это самый безопасный вариант. Похоже, должен быть какой-то более быстрый вариант, ха-ха.
@MrFlick Я вижу, что операция удаляет десятичные точки. Есть ли способ предотвратить это?
Этого не должно быть. Вы уверены, что у вас правильные позиции полей? Значения просто округляются во время печати? Может быть, покажите код, который вы на самом деле используете.
Это вопрос округления, вы правы. Извини. Еще раз спасибо!
Вот вариант извлечения информации из найденной кодовой книги @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 Хм, просто перезапустил код в новом сеансе, используя R 4.0.3, без загрузки дополнительных пакетов и без предупреждений/ошибок, у меня работает!
Спасибо, я только что проверил. Он также работает без каких-либо библиотек, загруженных в 3.6.1. Итак, я предполагаю, что у меня конфликт библиотек. Большое вам спасибо за вашу помощь!
Данные, на которые вы указали, не разделены. Это формат с фиксированной шириной. Вместо этого вы должны использовать read_fwf . Существует описание формата файла, доступного для этого файла: www2.census.gov/programs-surveys/saipe/technical-documentation/…