我有一个60gb的sas7bdat文件我试图在R中进行子集。有没有人知道这样做的方法?
我有SAS,大约需要14分钟才能完成,但我想在R中做到这一点。
谢谢
答案 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"