介紹如何在 R 語言中使用 sas7bdat
套件讀取 SAS7BDAT 格式的 SAS 檔案。
sas7bdat
套件sas7bdat 套件 可以從官方的 CRAN 套件庫直接下載安裝:
# 安裝 sas7bdat 套件 install.packages("sas7bdat")
這裡我們以 airline.sas7bdat 這個檔案來示範如何使用 R 的 sas7bdat
套件來讀取 SAS7BDAT 格式 SAS 檔案。
在引入 sas7bdat
套件之後,呼叫 read.sas7bdat
讀取 SAS7BDAT 格式的 SAS 檔案:
# 引入 sas7bdat 套件 library(sas7bdat) # 讀取 SAS7BDAT 格式的 SAS 檔案 df <- read.sas7bdat("airline.sas7bdat") head(df)
YEAR Y W R L K 1 1948 1.214 0.243 0.1454 1.415 0.612 2 1949 1.354 0.260 0.2181 1.384 0.559 3 1950 1.569 0.278 0.3157 1.388 0.573 4 1951 1.948 0.297 0.3940 1.550 0.564 5 1952 2.265 0.310 0.3559 1.802 0.574 6 1953 2.731 0.322 0.3593 1.926 0.711
透過 read.sas7bdat
所產生的 data frame 除了資料本身之外,還包含了許多屬性資料,我們可以使用 attributes
將這些屬性資料取出:
# 取得各類屬性資料 df.attr <- attributes(df)
names
屬性包含了所有的變數名稱:
# 變數名稱 df.attr$names
[1] "YEAR" "Y" "W" "R" "L" "K"
SAS 變數的屬性可以透過 column.info
來取得:
# 變數屬性 for (ci in df.attr$column.info) { cat("name:", ci$name, "\n") cat(" offset:", ci$offset, "\n") cat(" length:", ci$length, "\n") cat(" type:", ci$type, "\n") cat(" format:", ci$format, "\n") cat(" label:", ci$label, "\n") }
name: YEAR offset: 0 length: 4 type: numeric format: label: year name: Y offset: 4 length: 8 type: numeric format: label: level of output name: W offset: 12 length: 8 type: numeric format: label: wage rate name: R offset: 20 length: 8 type: numeric format: label: interest rate name: L offset: 28 length: 8 type: numeric format: label: labor input name: K offset: 36 length: 8 type: numeric format: label: capital input
亦可搭配 plyr
套件將變數屬性整理成 data frame:
# 將變數屬性整理成 data frame 格式 library(plyr) ci.df <- rbind.fill(lapply(df.attr$column.info, function(f) { as.data.frame(Filter(Negate(is.null), f)) })) ci.df
name offset length type fhdr foff flen label lhdr loff llen 1 YEAR 0 4 numeric 0 0 0 year 0 32 4 2 Y 4 8 numeric 0 0 0 level of output 0 40 15 3 W 12 8 numeric 0 0 0 wage rate 0 60 9 4 R 20 8 numeric 0 0 0 interest rate 0 76 13 5 L 28 8 numeric 0 0 0 labor input 0 96 11 6 K 36 8 numeric 0 0 0 capital input 0 112 13
若需要一次將一個目錄下的所有 SAS7BDAT 格式 SAS 檔案都轉為 CSV 檔案,同時將變數屬性也一併轉出,可以使用以下指令稿:
library(sas7bdat) library(plyr) # 大量 SAS7BDAT 檔案所在目錄 folder = "my_sas7bdat_folder" # 列出所有 SAS7BDAT 檔案 sas7bdat.files <- list.files(path = folder, pattern = "sas7bdat$") for (f in sas7bdat.files) { # 來源 SAS7BDAT 檔案 sas7bdat.path = file.path(folder, f) cat("Source:", sas7bdat.path, "\n") # 資料輸出 CSV 檔案 data.path = sub(".sas7bdat", "_data.csv", sas7bdat.path) cat("Data Output:", data.path, "\n") # 變數屬性輸出 CSV 檔案 var.attr.path = sub(".sas7bdat", "_attr.csv", sas7bdat.path) cat("Variable Attributes Output:", var.attr.path, "\n") # 讀取並輸出資料 data.df <- read.sas7bdat(sas7bdat.path) write.csv(data.df, file = data.path, fileEncoding = "UTF-8") # 讀取並輸出變數屬性 attr.df <- attributes(data.df) ci.df <- rbind.fill(lapply(attr.df$column.info, function(f) { as.data.frame(Filter(Negate(is.null), f)) })) write.csv(ci.df, file = var.attr.path, fileEncoding = "UTF-8") }
這裡在匯出 CSV 檔案時,使用的 fileEncoding
是 UTF-8
,若後續要在 Windows 系統下處理資料,建議改為 Big5
編碼(或是省略不指定 fileEncoding
,預設則為 Big5
編碼),這樣可以避免以 Excel 直接開啟時出現亂碼的問題。