read.sas7bdat无法读取压缩文件

时间:2014-06-16 15:18:17

标签: r sas

我正在尝试读取R中的.sas7bdat文件。当我使用命令

library(sas7bdat)
read.sas7bdat("filename")

我收到以下错误:

Error in read.sas7bdat("county2.sas7bdat") : file contains compressed data

我没有SAS经验,所以我们非常感谢您的帮助。

谢谢!

5 个答案:

答案 0 :(得分:8)

根据sas7bdat小插图[vignette('sas7bdat')],截至2013年,目前不支持COMPRESS=BINARY(或COMPRESS=YES)(这是2014年6月16日活动时的小插图我写了这个)。支持COMPRESS=CHAR

这些基本上是内部压缩例程,旨在使文件大小化。它们不如gz或类似(不是几乎那么好),但是在编写SAS程序时,SAS会透明地支持它们。显然他们会显着改变文件格式,因此还缺乏实现。

如果您有SAS,则需要将这些内容写入未压缩的数据集。

options compress=no;
libname lib '//drive/path/to/files';
data lib.want;
set lib.have;
run;

这是最简单的方法(假设你有多个),假设你有一个如上所述定义为lib的libname,并将havewant更改为正确的名称(have应该是没有文件扩展名的文件名,在大多数情况下; want可以更改为任何逻辑,只包含AZ或下划线,以及32个或更少的字符。)

如果您没有SAS,则必须询问所提供的数据,以使数据可以未压缩或以不同的格式使用。如果你是从网上某个地方的PUDS获得这个,你可以发布你从哪里获得它,并且可能有办法帮助你识别未压缩的来源。

答案 1 :(得分:5)

这无疑不是纯粹的R解决方案,但在许多情况下(例如,如果您不是在PC上并且没有能力自己编写SAS文件),其他解决方案并非如此可行的。

幸运的是,Python有一个模块(https://pypi.python.org/pypi/sas7bdat)支持读取压缩的SAS数据集 - 如果你还没有获得SAS,那么使用它肯定会更好。提取文件并通过Python将其保存为文本后,您可以在R中访问它。

from sas7bdat import SAS7BDAT
import pandas as pd

InFileName = "myfile.sas7bdat"
OutFileName = "myfile.txt"

with SAS7BDAT(InFileName) as f:
    df = f.to_data_frame()

df.to_csv(path_or_buf = OutFileName, sep = "\t", encoding = 'utf-8', index = False)

答案 2 :(得分:4)

“RevoScaleR”是读取SAS数据集(压缩或未压缩)的好包。您可以使用此包的rxImport功能。以下是示例

导入库

library(RevoScaleR)

读取数据

R_df_name <- rxImport("fake_path/file_name.sas7bdat")

此功能的速度远远优于haven / sas7bdat / sas7bdat.parso。我希望这可以帮助那些努力阅读R中的SAS数据集的人。

干杯!

答案 3 :(得分:3)

避货包可以读取SAS文件:

library(haven)
df <- read_sas("sasfile.sas7bdat")

但只有使用compress=char而不是compress=binary压缩的SAS文件。

所以避风港将能够阅读这个SAS文件:

data output.compressed_data_char (compress=char);
set inputdata;
run;

但不是这个SAS文件:

data output.compressed_data_binary (compress=binary);
set inputdata;
run;

https://cran.r-project.org/package=haven

http://support.sas.com/documentation/cdl/en/lrcon/62955/HTML/default/viewer.htm#a001002773.htm

答案 4 :(得分:0)

我发现R是最容易遇到这种挑战的方法,尤其是压缩的sas7dbat文件,它有以下三行:

library(haven)
data <- read_sas("yourfile.sas7dbat")

然后将其转换为csv

write.csv(data,"data.csv")