我正在尝试读取R中的.sas7bdat文件.当我使用该命令时
library(sas7bdat)
read.sas7bdat("filename")
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Error in read.sas7bdat("county2.sas7bdat") : file contains compressed data
Run Code Online (Sandbox Code Playgroud)
我没有SAS经验,所以任何帮助都将受到高度赞赏.
谢谢!
根据sas7bdat vignette [ 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;
Run Code Online (Sandbox Code Playgroud)
这是最简单的方法(很多),假设你有定义为LIBNAME lib如上和变化have,并want以是正确的(名字have应该是没有文件的扩展名的文件名,在大多数情况下,want是可以改变的,以什么逻辑与AZ或仅限下划线,不超过32个字符).
如果您没有SAS,则必须询问所提供的数据,以使数据以未压缩的形式提供,或以不同的格式提供.如果您是从网络上某处的PUDS获取此信息,则可以发布您从中获取信息的位置,并且可能有一种方法可以帮助您识别未压缩的来源.
Haven 包可以读取压缩的 SAS 文件:
library(haven)
df <- read_sas("sasfile.sas7bdat")
Run Code Online (Sandbox Code Playgroud)
但仅限使用 压缩的 SAS 文件compress=char,而不是compress=binary.
所以 Haven 将能够读取这个 SAS 文件:
data output.compressed_data_char (compress=char);
set inputdata;
run;
Run Code Online (Sandbox Code Playgroud)
但不是这个 SAS 文件:
data output.compressed_data_binary (compress=binary);
set inputdata;
run;
Run Code Online (Sandbox Code Playgroud)
https://cran.r-project.org/package=haven
http://support.sas.com/documentation/cdl/en/lrcon/62955/HTML/default/viewer.htm#a001002773.htm
公认这不是纯粹的R解决方案,但是在许多情况下(例如,如果您不在PC上并且没有能力自己编写SAS文件),其他发布的解决方案也不可行。
幸运的是,Python有一个模块(https://pypi.python.org/pypi/sas7bdat),该模块支持读取压缩的SAS数据集-如果您尚不具备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)
Run Code Online (Sandbox Code Playgroud)