ODBC ドライバーで R の SPSS データ ファイルを読み取るソリューションがあります。
1) IBM SPSS Statistics Data File Driverがあります。ダウンロードリンクが見つかりませんでした。SPSS プロバイダーから取得しました。Standalone Driver だけで十分です。ドライバーのインストールまたは使用に SPSS は必要ありません。
2) SPSS データ ドライバーの DSN を作成します。
3)RODBC
パッケージを使用すると、R で任意の SPSS データ ファイルを読み取ることができます。各変数の値ラベルを個別のテーブルとして取得できます。その後、R のラベルを任意の方法で使用することができます。
R でサンプル データ ファイルを読み込むための Windows での実際の例を次に示します (現在、私のコンピューターには SPSS がありません)。Linux でこれをテストしていません。Linux 用の SPSS データ ドライバーもあるため、Linux でも動作する可能性があります。
require(RODBC)
# Create connection
# Change the DSN name and CP_CONNECT_STRING according to your setting
con <- odbcDriverConnect("DSN=spss_ehsis;SDSN=SAVDB;HST=C:\\Program Files\\IBM\\SPSS\\StatisticsDataFileDriver\\20\\Standalone\\cfg\\oadm.ini;PRT=StatisticsSAVDriverStandalone;CP_CONNECT_STRING=C:\\temp\\data_expt.sav")
# List of tables
Tables <- sqlTables(con)
Tables
# List of table names to extract
table.names <- Tables$TABLE_NAME[Tables$TABLE_SCHEM != "SYSTEM"]
# Function to query a table by name
sqlQuery.tab.name <- function(table) {
sqlQuery(con, paste0("SELECT * FROM [", table, "]"))
}
# Retrieve all tables
Data <- lapply(table.names, sqlQuery.tab.name)
# See the data
lapply(Data, head)
# Close connection
close(con)
たとえば、2 つの変数に対して値ラベルを定義することができます。
[[5]]
VAR00002 VAR00002_label
1 1 Male
2 2 Female
[[6]]
VAR00003 VAR00003_label
1 2 Student
2 3 Employed
3 4 Unemployed
追加情報
これは、SPSS データ ファイルへの接続が確立された後に SPSS データを読み取ることができる関数です。この関数を使用すると、選択する変数のリストを指定できます。SPSS データファイルvalue.labels=T
内の値ラベル付きの選択された変数が、ラベル付きの R 因子に変換される場合。
このソリューションのパフォーマンスには満足していないと言わざるを得ません。小さなデータファイルに適しています。大規模な SPSS データ ファイル (変数のサブセットが選択されている場合でも) では、RAM の制限に達することがよくあります。
get.spss <- function(channel, variables = NULL, value.labels = F) {
VarNames <- sqlQuery(channel = channel,
query = "SELECT VarName FROM [Variables]", as.is = T)$VarName
if (is.null(variables)) variables <- VarNames else {
if (any(!variables %in% VarNames)) stop("Wrong variable names")
}
if (value.labels) {
ValueLabelTableName <- sqlQuery(channel = channel,
query = "SELECT VarName FROM [Variables]
WHERE ValueLabelTableName is not null",
as.is = T)$VarName
ValueLabelTableName <- intersect(variables, ValueLabelTableName)
}
variables <- paste(variables, collapse = ", ")
data <- sqlQuery(channel = channel,
query = paste("SELECT", variables, "FROM [Cases]"),
as.is = T)
if (value.labels) {
for (var in ValueLabelTableName) {
VL <- sqlQuery(channel = channel,
query = paste0("SELECT * FROM [VLVAR", var,"]"),
as.is = T)
data[, var] <- factor(data[, var], levels = VL[, 1], labels = VL[, 2])
}
}
return(data)
}