R:使用LaF(快速读取固定列宽数据)和SAScii(解析SAS Diciary以获取导入指令)

R:使用LaF(快速读取固定列宽数据)和SAScii(解析SAS Diciary以获取导入指令),r,import,R,Import,我正试图快速读入一个基于SAS导入文件(声明列宽等的文件)的ASCII固定列宽数据集 我知道我可以使用SAScii R包来翻译SAS导入文件(parse.SAScii)和实际导入(read.SAScii)。它可以工作,但速度太慢,因为read.SAScii使用read.fwf进行数据导入,这很慢。我想改变这一点,从“laf”包快速导入laf_open_fwf 使用parse.SAScii()和laf_open_fwf(),我就快到了,但是我能够正确地将parse.SAScii()的输出连接到la

我正试图快速读入一个基于SAS导入文件(声明列宽等的文件)的ASCII固定列宽数据集

我知道我可以使用SAScii R包来翻译SAS导入文件(parse.SAScii)和实际导入(read.SAScii)。它可以工作,但速度太慢,因为read.SAScii使用read.fwf进行数据导入,这很慢。我想改变这一点,从“laf”包快速导入laf_open_fwf

使用parse.SAScii()和laf_open_fwf(),我就快到了,但是我能够正确地将parse.SAScii()的输出连接到laf_open_fwf()的参数

以下是代码,数据来自PNAD,2013年全国住户调查:

# Set working dir.
  setwd("C:/User/Desktop/folder")

# installing packages: 
    install.packages("SAScii")
    install.packages("LaF")
    library(SAScii)
    library(LaF)

# Donwload and unzip data and documentation files
  # Data
    file_url <- "ftp://ftp.ibge.gov.br/Trabalho_e_Rendimento/Pesquisa_Nacional_por_Amostra_de_Domicilios_anual/microdados/2013/Dados.zip"
    download.file(file_url,"Dados.zip", mode="wb")
    unzip("Dados.zip")
  # Documentation files
    file_url <- "ftp://ftp.ibge.gov.br/Trabalho_e_Rendimento/Pesquisa_Nacional_por_Amostra_de_Domicilios_anual/microdados/2013/Dicionarios_e_input_20150814.zip"
    download.file(file_url,"Dicionarios_e_input.zip", mode="wb")
    unzip("Dicionarios_e_input.zip")

# importing with read.SAScii(), based on read.fwf(): Works fine
    dom.pnad2013.teste1 <- read.SAScii("Dados/DOM2013.txt","Dicionarios_e_input/input DOM2013.txt")

# importing with parse.SAScii() and laf_open_fwf() : stuck here
    dic_dom2013 <- parse.SAScii("Dicionarios_e_input/input DOM2013.txt")
    head(dic_dom2013)
    data <- laf_open_fwf("Dados/DOM2013.txt", 
                      column_types=?????  ,
                      column_widths=dic_dom2013[,"width"],
                      column_names=dic_dom2013[,"Varname"])
#设置工作方向。
setwd(“C:/User/Desktop/folder”)
#安装软件包:
安装软件包(“SAScii”)
安装程序包(“LaF”)
图书馆(国资委)
图书馆(LaF)
#不加载和解压缩数据和文档文件
#资料

文件url您可以尝试read.SAScii.sqlite,也是由Anthony Damico编写的。它的速度提高了4倍,并且不会导致RAM问题(正如作者自己所描述的)。但它将数据导入到SQLite自包含的数据库文件(不需要SQL server)——而不是data.frame。然后可以使用dbConnection在R中打开它。下面是代码的GitHub地址:

# Parse SAS file
  dic_pes2013 <- parse.SAScii("./Dicion rios e input/input PES2013.sas")
    
# Read .txt file using LaF. This is virtually instantaneous
  pesdata <- laf_open_fwf("./Dados/PES2013.txt", 
                          column_types= rep("character", length(dic_pes2013[,"width"])), 
                          column_widths=dic_pes2013[,"width"],
                          column_names=dic_pes2013[,"varname"])

# convert to data frame. This tooke me 20 sec.
  system.time( pesdata <- pesdata[,] )

在R控制台中,您只需运行:

    source("https://raw.githubusercontent.com/ajdamico/usgsd/master/SQLite/read.SAScii.sqlite.R")
它的参数几乎与常规read.SAScii的参数相同


我知道你在问如何使用LaF的提示。但是我认为这对您也很有用。

我认为最好的选择是使用desc包(C++代码)中的fwf2csv()。我将用PNAD 2013说明该程序。请注意,我认为您已经有了包含3个变量的字典:字段开头、字段大小、变量名称和数据的dara/

library(bit64)
library(data.table)
library(descr)
library(reshape)
library(survey)
library(xlsx)

end_dom <- dic_dom2013$beggining + dicdom$size - 1

fwf2csv(fwffile='Dados/DOM2013.txt', csvfile='dadosdom.csv', names=dicdom$variable, begin=dicdom$beggining, end=end_dom)

dadosdom <- fread(input='dadosdom.csv', sep='auto', sep2='auto', integer64='double')
库(位64)
库(数据表)
图书馆(descr)
图书馆(重塑)
图书馆(调查)
图书馆(xlsx)

end_domUPDATE:这里有两个解决方案,使用包
LaF
readr

使用
readr
的解决方案(8秒)
readr
基于LaF,但速度惊人。有关
readr

请注意,我在
列类型中使用了
字符
。如果我尝试
integer
numeric
,我不太清楚为什么命令会返回错误。这应该不是问题,因为您可以将所有列转换为
numeric
,如下所示:

  # convert all columns to numeric
    varposition  <- grep("V", colnames(pesdata)) 
    pesdata[varposition] <- sapply(pesdata[],as.numeric)
    sapply(pesdata, class)
#将所有列转换为数字

弗拉维奥,tks。UAU!这太快了!对于家庭级文件(DOM),它是即时的。对于更大的个人级别文件(PES),转换为csv需要21秒,读取(fread)需要4秒。使用read.fwf()(用read.SAScii()包装)需要53分钟。这是一种安全的方法吗?关于小数点、变量类型等,LucasMation方法分为两部分:从微数据到CSV的转换和读取CSV文件。第一部分,可能是FWF2CSV()所固定的主要问题,一旦这个函数是用C++编写的。在第二部分中,您可以使用您选择的任何方法,但我认为fread()是合理可靠的。您好,很抱歉,我来晚了:)有没有理由不使用此处托管的PNAD自动下载脚本?它可能不会太快,但是一旦你运行了代码,你就不必再这样做了……这太棒了——我正在努力用read.SAScii读取一个大数据集。read_fwf的速度快了200多倍!范塔斯蒂科!我是你的朋友!
  # convert all columns to numeric
    varposition  <- grep("V", colnames(pesdata)) 
    pesdata[varposition] <- sapply(pesdata[],as.numeric)
    sapply(pesdata, class)