【问题标题】:Importing and parsing a text file with blanks/NA's into R将带有空格/NA的文本文件导入并解析到R中
【发布时间】:2021-04-02 17:52:53
【问题描述】:

我想解析这个文本文件:

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. 县通常由多个名称组成,将县分布在多个列中

有没有办法处理这些问题?

想要的结果很简单,link 中可见的数据

【问题讨论】:

  • 你指向的数据没有分隔。它采用固定宽度格式。您应该改用read_fwf。有该文件可用的文件格式的描述:www2.census.gov/programs-surveys/saipe/technical-documentation/…
  • @MrFlick 谢谢!多么可怕的工作,但它确实有效……而且我想这无论如何都是最安全的选择。感觉应该有一个更快的选择虽然哈哈。
  • @MrFlick 我看到该操作删除了小数点。有什么办法可以防止吗?
  • 不应该。你确定你的字段位置正确吗?这些值是否在打印过程中被四舍五入?也许显示你实际运行的代码。
  • 这是一个四舍五入的问题,你是对的。对不起。再次感谢!

标签: r parsing text import na


【解决方案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 &gt; 1 and only the first element will be used
  • @Tom 嗯,只需使用 R 4.0.3 在新会话中重新运行代码,无需加载其他包,也没有警告/错误,对我有用!
  • 谢谢,我刚刚查过了。它也无需在 3.6.1 中加载任何库即可运行。所以我想我有图书馆冲突。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多