4

我有一些来自人口普查的微数据文件存储为 .txt 并以 ASCII 编码。当我在文本编辑器中打开它们时,我会得到类似: 1100015110001500100100003624008705865085282310200600101011022022 14 444231等。

由于我对 ASCII 数据的制表没有经验,我想知道是否有任何方法可以使用 R 和/或我需要什么类型的补充软件来完成这项工作。

实际上,起初我想“正常”地查看我的数据,也就是说,如果可能的话,将其视为一个表格(文件大小在 40mb 和 500mb 之间变化)。然后我想做一些简单的计算,稍后将结果存储为 csv。在其他情况下使用它。

谁能给我一些建议?

4

2 回答 2

8

这个巴西人口普查网站提供了一个 SAS 输入脚本。仅使用 SAS 导入脚本导入 ASCII 数据集的最快方法是使用SAScii 包您可以在这个压缩文件中找到 SAS 导入脚本——它是 INPUT.txt。请注意,这些 SAS 导入指令的 INPUT 块直到第四行才开始,因此您的beginline参数将为 4。首先测试您是否正确读取了 SAS 脚本?parse.SAScii

library(SAScii)
parse.SAScii( "INPUT.txt" , beginline = 4 )

一旦您看到正确打印了列名和宽度,您就可以使用该?read.SAScii函数将您的文本文件直接读入 R 数据框

x <- read.SAScii( "filename.txt" , "INPUT.txt" , beginline = 4 )
head( x )

如果您的文件太大而无法完全读入 RAM,则可以将其读入 SQLite 数据库。使用read.SAScii.sqlite()不是在 SAScii 包中而是在我的 github 帐户中找到的函数——它只是 read.SAScii() 函数的一个轻微变化,但它不会使 RAM 过载。您可以在这个美国政府调查数据集网站的下载脚本中看到它的使用示例。

有关 SAScii 包的更多详细信息,请查看此概述

于 2012-12-20T13:12:55.290 回答
2

一个很好的替代方案是 package readr,这是一种读取固定列宽数据的极快解决方案。更多信息在readr 这里

因此read.SAScii,您可以使用基于readr. 像这样:

# Load Packages
  library(readr)
  library(SAScii)
  library(data.table)


# Parse input file
  dic_pes2013 <- parse.SAScii("INPUT.txt")

  setDT(dic_pes2013) # convert to data.table

# read to data frame
  pesdata2 <- read_fwf("./Dados/PES2013.txt", 
                       fwf_widths(dput(dic_pes2013[,width]),
                                  col_names=(dput(dic_pes2013[,varname]))),
                                  progress = interactive()
                                  )

我刚刚在 1.2 分钟内读取了包含 243 个变量的 240 万条记录(文件Amostra_Pessoas_35_outras.txt)。

附言。如果您没有这些input.txt文件,这里是关于如何创建它们的简短脚本。

请注意,某些变量有小数,这在此处发布的答案提供的解决方案中未包含(至少到目前为止)。考虑到这一点,我会在此处R推荐此脚本,它将帮助您下载 2010 年巴西人口普查数据集,将它们读入数据框并将它们保存为文件。.csv

于 2015-10-02T21:29:02.260 回答