如何读入R中的大型sas7bdat数据集?

时间:2014-03-06 01:44:21

标签: r

我有一个60gb的sas7bdat文件我试图在R中进行子集。有没有人知道这样做的方法?

我有SAS,大约需要14分钟才能完成,但我想在R中做到这一点。

谢谢

2 个答案:

答案 0 :(得分:2)

请参阅我的回答here -

我发现Private BGWorker As BackgroundWorker BGWorker = New BackgroundWorker() BGWorker.WorkerReportsProgress = True BGWorker.WorkerSupportsCancellation = True AddHandler BGWorker.ProgressChanged, New ProgressChangedEventHandler(AddressOf BGWorker_ProgressChanged) Private Sub BGWorker_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs) Try If e.UserState.ToString <> "" Then Me.lblStatusMsg.Text = e.UserState.ToString Me.lblStatusMsg.Refresh() End If Me.ProgressSingle.Value = e.ProgressPercentage Catch ex As Exception 'We don't care End Try End Sub Public Function SqxCallback(ByVal pParam As IntPtr, ByRef CallbackInfo As SQX_CALLBACKINFO) As Integer Dim message as String = "" If CallbackInfo.pszSourceFileName IsNot Nothing Then message = " compressing... " & CallbackInfo.pszSourceFileName End If BGWorker.ReportProgress(CallbackInfo.iProgress, Message & "...") Return 1 End Function 包能够在阅读haven文件时合理快速地工作。

无论如何,在60GB时,您最好的选择可能是将其转换为sas7bdat.csv可以处理的内容,然后将fread转换为data.table::fread

答案 1 :(得分:1)

我下载了将Sas转换为csv的精彩dsread http://www.oview.co.uk/dsread/

您应该从CMD使用它,但我选择将其集成到R. 我创建了一个将Sas迁移到csv的函数:

esp_Sas_Csv<-function(dir,file_input,dir_output,device="c:") {
p1<-paste("cd",dir)
if(tolower(device)!="c:") {p1<-paste(device,"\n",p1)}

#"open" the program

p2<-"SET dsread=C:\\dsread\\dsread.exe"
cmd2<-paste('"%dsread%" /v /t ',file_input,' >  "',dir_output,file_input,'.csv"',sep="")

cmd<-paste(p1,p2,cmd2, sep="\n")
setwd("c:\\temp")
write(cmd,"sas_to_csv.bat")
system("sas_to_csv.bat")

}

此代码:

device<-"c:"
dir<-"C:\\temp\\"
file_input<-"my_sas_tab"
dir_output<-"C:\\temp\\"

esp_Sas_Csv(dir,file_input,dir_output,device)

生成并运行.bat之类的

cd C:\temp\
SET dsread=C:\dsread\dsread.exe
"%dsread%" /v /t my_sas_tab >  "C:\temp\my_sas_tab.csv"