我正在尝试读取R中的.sas7bdat文件。当我使用命令
时library(sas7bdat)
read.sas7bdat("filename")
我收到以下错误:
Error in read.sas7bdat("county2.sas7bdat") : file contains compressed data
我没有SAS经验,所以我们非常感谢您的帮助。
谢谢!
答案 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,并将have
和want
更改为正确的名称(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")