5

私の会社では、R を選択して SPSS を段階的に廃止することを考えています。移行中は、データは引き続き SPSS データ ファイル形式 (.sav) で提供されます。

この SPSS データファイルを R にインポートする際に問題が発生しています。SPSS ファイルを R にインポートするときに、変数の値と値ラベルの両方を保持したいと考えています。パッケージのread.spss()関数foreignは、変数の値または値ラベルのいずれかを保持するオプションを提供しますが、両方を保持することはできません。

私の知る限り、R では因子変数に値 (レベル) と値ラベル (レベル ラベル) を持たせることができます。read.spss()これを組み込むために何らかの方法で関数を変更することが可能かどうか疑問に思っていました.

spss.system.file()あるいは、これを可能にすると思われるパッケージの関数に出くわしmemiscましたが、別の構文ファイル (codes.file) を要求しますが、これは常に利用できるとは限りません。

サンプル データ ファイルを次に示します。

この問題を解決するための助けをいただければ幸いです。

ありがとう。

4

5 に答える 5

4

SPSS メタデータを読み込む方法がわかりません。私は通常、.csv ファイルを読み取ってメタデータを追加し直すか、小さな 1 回限りの PERL スクリプトを作成して作業を行います。私が言及したかったのは、最近公開された R パッケージRzが、SPSS データを R に取り込むのに役立つ可能性があるということです。

于 2013-01-30T17:15:24.587 に答える
2

私の仕事も同じ移行期を迎​​えています。

read.spss() は、変数ラベルを作成したオブジェクトの属性として返します。したがって、以下の例では、to.data.frame=TRUE を指定して read.spss() によって作成された rvm というデータ フレームがあります。短い名前 a1、a2 などの 3,500 の変数がありますが、SPSS の各変数には長いラベルが付いています。次の方法で変数ラベルにアクセスできます

cbind(attributes(rvm)$variable.labels)

までの 3,500 個の変数のフルネームすべてのリストを返します。

…
x23      "Other Expenditure Uncapped Daily Expenditure In Region"          
x24      "Accommodation Expenditure In Region"                             
x25      "Food/Meals/Drink Expenditure In Region"                          
x26      "Local Transport Expenditure In Region"                           
x27      "Sightseeing/Attractions Expenditure In Region"                   
x28      "Event/Conference Expenditure In Region"                          
x29      "Gambling/Casino Expenditure In Region"                           
x30      "Gifts/Souvenirs Expenditure In Region"                           
x31      "Other Shopping Expenditure In Region"                            
x0       "Accommodation Daily Expenditure In Region"  

これらをどうするかは別の問題ですが、少なくとも私はそれらを持っています。必要に応じて、保管したり、grep で検索したりするために、それらを別のオブジェクトに入れることができます。

于 2013-01-30T20:29:32.323 に答える
2

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)
}
于 2013-02-26T15:19:34.707 に答える
1

SPSSを利用できるので、 SPSS内でRを実行できる「Essentialsfor R」プラグイン(無料ですが、登録する必要があります。インストール手順も参照してください)をインストールすることをお勧めします。プラグインには、アクティブなSPSSデータフレームをRに(およびその逆に)転送する機能を備えたRパッケージが含まれています。これには、ラベル付きの因子レベル、日付、ドイツ語のウムラウトなど、他の方法では難しいことで有名な詳細が含まれます。foreign私の経験では、R自身のパッケージよりも信頼性があります。

すべての設定が完了したら、SPSSでデータを開き、構文ウィンドウで次のコードのようなものを実行します。

begin program r.
myDf <- spssdata.GetDataFromSPSS(missingValueToNA=TRUE,
                                 factorMode="labels",
                                 rDate="POSIXct")
save(myDf, file="d:/path/to/your/myDf.Rdata")
end program.

Essentials for Rプラグインリンク(明らかにマークダウンリンク構文を壊します):

https://www.ibm.com/developerworks/mydeveloperworks/wikis/home/wiki/We70df3195ec8_4f95_9773_42e448fa9029/page/Downloads%20for%20IBM®%20SPSS®%20Statistics?lang=en
于 2013-01-30T19:41:52.333 に答える