处理R中的ASCII编码

4
我有一些人口普查的微观数据文件,存储为.txt格式并以ASCII编码。
当我在文本编辑器中打开它们时,会得到以下类似的内容: 1100015110001500100100003624008705865085282310200600101011022022 14 444231 等等。
由于我没有处理ASCII数据的经验,我想知道是否有任何方法可以使用R完成此操作,或者需要什么类型的辅助软件。
实际上,首先我想以“正常”的方式查看我的数据,也就是说,如果可能的话,将其显示为表格(文件大小在40MB和500MB之间变化)。然后,我想进行一些简单的计算,并将结果保存为csv,以便在其他情境中使用。
有人能给我一些建议吗?

您提供的上下文不足。一般来说,R 可以很好地处理这种文本数据,并支持 ASCII 编码。您可以为 read.table 等函数指定 fileEncoding,但如果您的数据仅为数字,则无需在首次使用时指定。 - Konrad Rudolph
1
请指向您正在查看的数据文件! :) - Anthony Damico
主要问题是数据以ASCII代码形式出现。我不知道如何将其转换为字符或如何在R中使用这种形式的数据。以下是数据的示例ftp://ftp.ibge.gov.br/Censos/Censo_Demografico_2010/Resultados_Gerais_da_Amostra/Microdados/AP.zip。 - Joschi
1
如果你的源文件应该包含实际数据的2或3位ASCII代码,那么你必须找出源文件的格式(例如分隔符)。无论是R还是其他任何语言都不能自动完成这项任务。 - Carl Witthoft
巴西人口普查的另一个选择: http://www.asdfree.com/search/label/censo%20demografico%20no%20brasil%20%28censo%29 - Anthony Damico
显示剩余2条评论
2个回答

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

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

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

如果您的文件太大,无法完全读入RAM,请将其读入SQLite数据库。 使用我的Github帐户中找到的read.SAScii.sqlite()函数 -- 它只是 read.SAScii() 函数的轻微变化,但它不会超载RAM。 您可以在此联合政府调查数据集网站上的下载脚本中看到其使用示例。
有关SAScii包的更多详细信息,请参见这个概述

2
如果您找不到SAS导入脚本,即使有布局文件,您也可以根据Romain上面所述的从导入Excel布局构建read.fwf调用。它指示字段的开始和结束位置,因此您只需获取起始和结束位置,并使用它们的差作为width参数 :) 祝您好运! - Anthony Damico
好的。到目前为止,它与SAS导入脚本完美地配合工作 ;) - Joschi
好的,刚刚读完了包含 78,344 行数据和 187 个变量的最小文件。大约花了四分半钟的时间。也许使用数据库是一个非常好的主意! - Joschi
@Joschi SQLite路线实际上会更慢-尝试使用最大的文件,看看是否会超载你的RAM :) 另一个选择可能是使用parse.SAScii仅确定字段宽度,然后在descr包中使用fwf2csv。此时,您可以使用read.csvread.csv.sql而仍不会超载RAM。这个函数的中间有一个这样做的例子 - Anthony Damico
@Joschi 我不知道你能否发现,我经常这样做 ;) - Anthony Damico
好的,我尝试了一下,没有崩溃。但是花了一些时间;) 感谢您指出并开发这个软件包,我将来肯定会经常用它进行微观数据分析!!! - Joschi

2
一个很好的替代方案是使用包readr,它是一种非常快速的解决方案,用于读取定长列数据。有关readr的更多信息,请单击此处
因此,您可以使用基于readr的更快选项,而不是read.SAScii。像这样:
# 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文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接