【问题标题】:Handle ASCII in R在 R 中处理 ASCII
【发布时间】:2012-12-07 23:08:50
【问题描述】:

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

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

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

谁能给我一些建议?

【问题讨论】:

  • 您提供的上下文不足。一般来说,R 能够很好地处理这样的文本数据,并且 ASCII 是受支持的编码。您可以为 read.table 等函数指定 fileEncoding,但如果您的数据只是数字,则首先不需要。
  • 将我们指向您正在查看的数据文件! :)
  • 主要问题是,数据以 ASCII 码出现。我不知道如何将其转换为字符或如何在 R 中以这种形式使用它。这是数据ftp.ibge.gov.br/Censos/Censo_Demografico_2010/… 的示例
  • @Joschi 您从哪里获得此链接的页面?哪里有 SAS 导入说明?
  • 如果您的意思是您的源文件应该包含实际数据的 2 位或 3 位 ASCII 代码,那么您必须找出格式(例如分隔符)是源文件。 R 和任何其他语言都不能自动为您做到这一点。

标签: r ascii file-handling


【解决方案1】:

一个不错的选择是包readr,一个extremely fast solution 来读取固定列宽数据。更多信息readrhere

因此,您可以使用基于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)。

ps。如果您没有 input.txt 文件,here 是关于如何创建它们的简短脚本。

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

【讨论】:

    【解决方案2】:

    这个巴西人口普查网站提供了 SAS 输入脚本。仅使用 SAS 导入脚本导入 ASCII 数据集的最快方法是使用the SAScii package。您可以在this zipped file 中找到 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 数据库。使用不在 SAScii 包中但在 my github account here 中找到的 read.SAScii.sqlite() 函数——它只是 read.SAScii() 函数的一个轻微变化,但它不会使 RAM 过载。您可以在此united states government survey data set website 的下载脚本中查看其用法示例。

    有关 SAScii 包的更多详细信息,请查看this overview

    【讨论】:

    • 如果您找不到 SAS 导入脚本,即使有布局文件,您也可以通过导入 excel 布局正确构建上述 Romain 所述的read.fwf 调用。它具有字段开始和结束的位置,因此您只需获取开始和结束位置,并将它们的差异用作width 参数:) 祝你好运!
    • 好的。直到知道它与 SAS 导入脚本配合得很好;)
    • 好的,刚刚读完包含 187 个变量的 78,344 个观测值的最小文件。大约花了4:30分钟。所以也许使用数据库是个好主意!
    • @Joschi SQLite 路由实际上会更慢 - 尝试使用最大的文件,看看它是否会使您的 RAM 过载 :) 另一个选项可能是使用 parse.SAScii 来确定字段宽度,然后在descr 包中使用fwf2csv。此时您可以read.csvread.csv.sql 并且仍然不会使RAM 过载。 there's an example of this being done in the middle of this function
    • @Joschi idk 如果你能说出来,我经常这样做;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 2021-06-04
    • 2018-12-05
    • 2013-03-22
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多