gpt4 book ai didi

R:使用 LaF(快速读取固定列宽数据)和 SAScii(解析 SAS 字典以获取导入说明)

转载 作者:行者123 更新时间:2023-12-04 11:32:05 24 4
gpt4 key购买 nike

我正在尝试基于 SAS 导入文件(声明列宽等的文件)将 ASCII 固定列宽数据集快速读入 R。

我知道我可以使用 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"])

我卡在最后一个命令上,将导入参数传递给 laf_open_fwf()。

最佳答案

更新:这里有两个解决方案,使用包 LaFreadr

使用readr的解决方案(8秒)

readr 基于 LaF,但速度惊人。有关 readr 的更多信息 here

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

# Parse SAS file
dic_pes2013 <- parse.SAScii("./Dicion rios e input/input PES2013.sas")

setDT(dic_pes2013) # convert to data.table

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

Take way: readr 似乎是最好的选择:它更快,你不需要担心列类型,更短的代码并且它显示了一个进度条:)

使用 LaF 的解决方案(20 秒)

LaF 根据 benchmark,这是在 R 中读取固定宽度文件的最快方法之一(也许是 THE) .我花了 20 秒。将人员级别文件 (PES) 读入数据框。

代码如下:

# 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[,] )

请注意,我在 column_types 中使用了 character。我不太清楚为什么在我尝试 integernumeric 时命令会返回错误。这应该不是问题,因为您可以像这样将所有列转换为 numeric:

  # convert all columns to numeric
varposition <- grep("V", colnames(pesdata))
pesdata[varposition] <- sapply(pesdata[],as.numeric)
sapply(pesdata, class)

关于R:使用 LaF(快速读取固定列宽数据)和 SAScii(解析 SAS 字典以获取导入说明),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25925381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com