データファイルをマージする|SPSS学習モジュール

はじめに

2つのデータファイルがある場合、それらを並べてマージし、識別子に基づいて観測値を一致させることで結合することができます。 たとえば、以下にはdadsを含むファイルがあり、famincを含むファイルがあります。 ファイルをマージして、キー変数famidに基づいてfaminc観測と同じ行にdads観測があるようにしたいと思います。

dads famid name inc 2 Art 22000 1 Bill 30000 3 Paul 25000 faminc famid faminc96 faminc97 faminc98 3 75000 76000 77000 1 40000 40500 41000 2 45000 45400 45800 

dadsとfamincをマージして一致させた後、データは次のようになります。

famid name inc faminc96 faminc97 faminc98 1 Bill 30000 40000 40500 41000 2 Art 22000 45000 45400 45800 3 Paul 25000 75000 76000 77000 

一対一のマージ

マージするファイルを作成することから始めましょう。 以下では、ファイルdadsを作成します。savとfaminc。サヴ

DATA LIST LIST / famid * name (A4) inc.BEGIN DATA.2 Art 220001 Bill 300003 Paul 25000END DATA.LIST.SAVE OUTFILE = "dads.sav".DATA LIST LIST / famid faminc96 faminc97 faminc98.BEGIN DATA.3 75000 76000 770001 40000 40500 410002 45000 45400 45800END DATA.LIST.SAVE OUTFILE = "faminc.sav". 

これらのステートメントの出力を以下に示し、データを適切に読み取ったことを確認します。

FAMID NAME INC 2.00 Art 22000.00 1.00 Bill 30000.00 3.00 Paul 25000.00FAMID FAMINC96 FAMINC97 FAMINC98 3.00 75000.00 76000.00 77000.00 1.00 40000.00 40500.00 41000.00 2.00 45000.00 45400.00 45800.00

mergeの父親と一致させるには、3つの手順があります。savとファミ通…サヴ (これは、dadsとfamincレコードの間に一対一の対応があるため、一対一のマージであることに注意してください。)これらの3つのステップを以下に示します。

  1. ソートケースを使用して、famidのお父さんをソートし、そのファイルを保存します(dads2と呼びます。sav)
  2. ソートケースを使用してfamidのfamincをソートし、そのファイルを保存します(faminc2と呼びます。sav)
  3. DADS2をマージするには、マッチファイルを使用します。savとfaminc2.famidに基づくsavファイル

以下は、マージを実行するためのコマンドを示しています。

GET FILE="dads.sav".SORT CASES BY famid.SAVE OUTFILE="dads2.sav".GET FILE="faminc.sav".SORT CASES BY famid.SAVE OUTFILE="faminc2.sav".MATCH FILES FILE="dads2.sav" /FILE="faminc2.sav" /BY famid.LIST.

以下の出力は、match mergeが正常に機能したことを示しています。

FAMID NAME INC FAMINC96 FAMINC97 FAMINC98 1.00 Bill 30000.00 40000.00 40500.00 41000.00 2.00 Art 22000.00 45000.00 45400.00 45800.00 3.00 Paul 25000.00 75000.00 76000.00 77000.00

一対多のマージ

次の例では、あるファイル内のある観測値が別のファイル内の複数の一致するレコードを持つ可能性がある一対多のマージを考えます。 前の例で見たように、お父さんと一緒にファイルがあり、お父さんが複数の子供を持つことができる子供と一緒にファイルがあるとします。 1つのお父さんの観測値を1つ以上の(多くの)子供の観測値に一致させているため、これが1対多のマージと呼ばれる理由がわかります。 Dadsファイルは1つの観測値を持つファイルであり、kidsファイルは多くの観測値を持つファイルであることに注意してください。 以下では、お父さんと子供のためのデータファイルを作成します。

DATA LIST LIST / famid * name (A4) inc .BEGIN DATA.2 Art 220001 Bill 300003 Paul 25000END DATA.LIST.SAVE OUTFILE = "dads.sav".DATA LIST LIST / famid * kidname (A4) birth age wt * sex (A1).BEGIN DATA.1 Beth 1 9 60 f1 Bob 2 6 40 m1 Barb 3 3 20 f2 Andy 1 8 80 m2 Al 2 6 50 m2 Ann 3 2 20 f3 Pete 1 6 60 m3 Pam 2 4 40 f3 Phil 3 2 20 mEND DATA.LIST.SAVE OUTFILE="kids.sav".

以下に示すように、一対多のマージを行うための手順は、上で見た一対一のマージに似ています。

  1. sort CASES BYを使用してfamidのお父さんをソートし、そのファイルを保存します(dads2と呼びます)
  2. sort CASES BYを使用してfamidの子供をソートし、そのファイルを保存します(kids2と呼びます)
  3. MATCH FILESを使用してdads2とkids2ファイルをマージします。 ただし、dadsファイルは1つの観測値を持つファイルであるため、/TABLE=”dads2.sav”,not/FILE=”dads2.dadsファイルを指定するには”sav”を指定します。
GET FILE="dads.sav".SORT CASES BY famid.SAVE OUTFILE="dads2.sav".GET FILE="kids.sav".SORT CASES BY famid.SAVE OUTFILE="kids2.sav".MATCH FILES FILE="kids2.sav" /TABLE="dads2.sav" /BY famid.LIST.

以下の出力は、このマージが期待どおりに機能したことを示しています。

FAMID KIDNAME BIRTH AGE WT SEX NAME INC 1.00 Beth 1.00 9.00 60.00 f Bill 30000.00 1.00 Bob 2.00 6.00 40.00 m Bill 30000.00 1.00 Barb 3.00 3.00 20.00 f Bill 30000.00 2.00 Andy 1.00 8.00 80.00 m Art 22000.00 2.00 Al 2.00 6.00 50.00 m Art 22000.00 2.00 Ann 3.00 2.00 20.00 f Art 22000.00 3.00 Pete 1.00 6.00 60.00 m Paul 25000.00 3.00 Pam 2.00 4.00 40.00 f Paul 25000.00 3.00 Phil 3.00 2.00 20.00 m Paul 25000.00

1対1のマージと1対多のマージの主な違いは、/TABLE=”dads2″を使用する必要があることです。sav”の代わりに/FILE=”dads2.sav”を発表した。 データについては、1対多のマージを行うときに、どのファイルが1の役割を果たしているかを自問してください(1対多)。 そのファイルには、/FILE=の代わりに/TABLE=を使用します。

意図的にエラーを作成し、/FILE=”dads2.sav”とSPSSが何をするかを参照してください。

MATCH FILES /FILE="kids2.sav" /FILE="dads2.sav" /BY famid.LIST.

私たちが最初に気づくのは、SPSSが以下に示す警告を与えることです。 これは、与えられたお父さんのために複数の子供がいることを私たちに伝えています。

Warning # 5132Duplicate key in a file. The BY variables do not uniquely identify eachcase on the indicated file. Please check the results carefully.

SPSSが助言するように、私達は結果を注意深く点検します。 確かに、私たちは結果が私たちが望んでいたものではないことを見ています。 お父さんごとに複数の子供がいた場合、最初の子供とお父さんだけがマージされ、同じ父親を持つ次の子供には、お父さん情報(名前とinc)の欠損値が割り当 前の例で/TABLE=サブコマンドを使用した場合、SPSSはすべての子供に父親の情報を渡しました。

FAMID KIDNAME BIRTH AGE WT SEX NAME INC 1.00 Beth 1.00 9.00 60.00 f Bill 30000.00 1.00 Bob 2.00 6.00 40.00 m . 1.00 Barb 3.00 3.00 20.00 f . 2.00 Andy 1.00 8.00 80.00 m Art 22000.00 2.00 Al 2.00 6.00 50.00 m . 2.00 Ann 3.00 2.00 20.00 f . 3.00 Pete 1.00 6.00 60.00 m Paul 25000.00 3.00 Pam 2.00 4.00 40.00 f . 3.00 Phil 3.00 2.00 20.00 m .

新しいファイル内の変数の順序付け

/MAPサブコマンドをADD FILESコマンドと共に使用すると、以下に示すように、新しいファイル内の変数の順序を確認で 新しいファイル内の変数の順序を再配置したい場合は、/KEEPサブコマンドをADD FILESコマンドに追加することもできます。 変数は、/KEEPサブコマンドにリストされている順序で新しいファイルで順序付けされます。 /KEEPサブコマンドにすべての変数をリストしない場合、リストされていない変数は新しいファイルには存在しません。/KEEPサブコマンドを使用すると、 また、並べ替えが必要な唯一の変数である場合は、最初のいくつかの変数をリストし、キーワードALLを使用して残りの変数を新しいファイルに含めること /KEEPサブコマンドで指定されていない変数は、元のファイル内の順序のままになります。

DATA LIST LIST / famid * name (A4) inc.BEGIN DATA.2 Art 220001 Bill 300003 Paul 25000END DATA.SAVE OUTFILE = "dads.sav".DATA LIST LIST / famid * name (A4) inc.BEGIN DATA.1 Bess 150003 Pat 500002 Amy 18000END DATA.SAVE OUTFILE = "moms.sav".
ADD FILES FILE="dads.sav" /FILE="moms.sav" /KEEP = name ALL /MAP.EXECUTE.
Map of the result fileResult Input1 Input2
------ ------ ------
NAME NAME NAME
FAMID FAMID FAMID
INC INC INC

ご覧のとおり、新しいファイルの変数は、注文名famid inc.になりました。

5.1一対一のマージでの不一致レコード

二つのデータファイルが持っているレコードが一致しない可能性があります。 以下では、対応する家族を持っていない余分なお父さん(famid4のKarl)を含めることによってこれを説明し、対応するお父さんを持っていない家族ファイルに

DATA LIST LIST / famid * name (A4) inc.BEGIN DATA.2 Art 220001 Bill 300003 Paul 250004 Karl 95000END DATA.SORT CASES BY famid.SAVE OUTFILE = "dads.sav".DATA LIST LIST / famid faminc96 faminc97 faminc98.BEGIN DATA.3 75000 76000 770001 40000 40500 410002 45000 45400 458005 55000 65000 700006 22000 24000 28000END DATA.SORT CASES BY famid.SAVE OUTFILE = "faminc.sav".MATCH FILES FILE="dads.sav" /IN=fromdad /FILE="faminc.sav" /IN=fromfam /BY famid.LIST.CROSSTABS /TABLES= fromdad BY fromfam.

上記のように、/IN=fromdadを使用して、結果のファイルにdadsファイルのデータを含むレコードが含まれているかどうかを示す0/1変数を作成します。 同様に、/IN=fromfamを使用して、結果のファイルにfamincファイルのレコードがあるかどうかを示します。 リストとクロスタブは、不一致のレコードについて私たちを示しています。

LISTコマンドからの出力は、不一致レコードがあったときにそれを示しています。 Famid4の場合、famid4の父親からのデータがあったが、famincからのデータはなかったため、fromdadの値は1であり、fromfamは0です。 また、予想されるように、このレコードには、dadsファイルの変数(nameおよびinc)の有効なデータと、famincの変数(faminc96faminc97およびfaminc98)のデータがありません。 私たちは、ファミッド5と6のための逆のパターンを参照してくださ

FAMID NAME INC FAMINC96 FAMINC97 FAMINC98 FROMDAD FROMFAM 1.00 Bill 30000.00 40000.00 40500.00 41000.00 1 1 2.00 Art 22000.00 45000.00 45400.00 45800.00 1 1 3.00 Paul 25000.00 75000.00 76000.00 77000.00 1 1 4.00 Karl 95000.00 . . . 1 0 5.00 . 55000.00 65000.00 70000.00 0 1 6.00 . 22000.00 24000.00 28000.00 0 1

fromdad変数とfromfam変数を見ると、一致するデータを持つ3つのレコード、dadsからのデータのみを持つ1つ、famincファイルからのデータのみを持つ2つのレコードがあるこ 以下のクロス集計は同じ結果を示しており、手動で集計するよりも照合を集計する方が簡単です。

FROMDAD by FROMFAM FROMFAM Page 1 of 1 Count | | | Row | 0| 1| TotalFROMDAD --------+------+------+ 0 | | 2| 2 | | | 33.3 +------+------+ 1 | 1| 3| 4 | | | 66.7 +------+------+ Column 1 5 6 Total 16.7 83.3 100.0

ファイルを照合する場合は、この方法を使用して2つのファイルの照合を確認することをお勧めします。 予期しないレコードの不一致がある場合は、レコードの不一致の原因を理解するために調査する必要があります。

SELECT IFを使用すると、一致しないレコードの一部を削除できます。 たとえば、父親が家族の情報と一致したレコードだけを保持する場合は、次のように入力します

SELECT IF fromdad AND fromfam.LIST.

結果は、一致する3つのレコードだけを含めて以下に示されています。

FAMID NAME INC FAMINC96 FAMINC97 FAMINC98 FROMDAD FROMFAM 1.00 Bill 30000.00 40000.00 40500.00 41000.00 1 1 2.00 Art 22000.00 45000.00 45400.00 45800.00 1 1 3.00 Paul 25000.00 75000.00 76000.00 77000.00 1 1

5.2一対多マージでの不一致レコード

SPSSは、一対多マージでの不一致レコードの包含を、一対多マージとは異なる方法で処理します。 一対多のマージでは、他のファイルの多くの観測値に一致する観測値を持つファイルがあることを覚えておいてください。 1つのファイルに多数のファイルと一致しない観測値がある場合、これらの観測値はマージされたファイルにはまったく表示されません。 1つのファイルに一致しない観測値が多数のファイルにある場合、それらのレコードはマージされたファイルに表示されます。 これが必要な場合は、セクション3に示すようにファイルをマージし、前のセクションに示すように/IN=を使用して一致を追跡することができます。 ただし、1つのファイルと複数のファイルの不一致レコードをマージされたファイルに両方表示する場合は、以下に示す一致戦略を使用できます。

以下では、お父さんと子供をマージするために私たちの例を使用し、この例では、両方のファイルに不一致のレコードを持っています。 以下では、マージされたファイルに一致しないすべてのレコードを含めるためにファイルを照合します。 異なる部分は赤で示されています。

DATA LIST LIST / famid * name (A4) inc.BEGIN DATA.2 Art 220001 Bill 300003 Paul 250004 Karl 95000END DATA.SAVE OUTFILE = "dads.sav".DATA LIST LIST / famid * kidname (A4) birth age wt * sex (A1).BEGIN DATA.1 Beth 1 9 60 f1 Bob 2 6 40 m1 Barb 3 3 20 f2 Andy 1 8 80 m2 Al 2 6 50 m2 Ann 3 2 20 f3 Pete 1 6 60 m3 Pam 2 4 40 f3 Phil 3 2 20 m5 Ted 1 4 35 m5 Tess 2 2 18 fEND DATA.SAVE OUTFILE="kids.sav".GET FILE="kids.sav".SORT CASES BY famid.SAVE OUTFILE="kids2.sav".GET FILE="dads.sav".SORT CASES BY famid.SAVE OUTFILE="dads2.sav".SAVE OUTFILE="dadid.sav" /KEEP=famid.MATCH FILES FILE="kids2.sav" /IN=inkid /FILE="dadid.sav" /BY famid .LIST.SAVE OUTFILE="temp.sav".MATCH FILES FILE="temp.sav" /TABLE="dads2.sav" /IN=dads /BY famid.LIST.

赤のセクションでは、マッチングに追加のステップが追加されます。 このステップの目的は、dadsファイルにのみあるfamidの値をkidsファイルに追加することです。 これは、dadidとkidsの間で一対一のマージを行い、そのファイルをtempとして保存します。 Dadidはすべてのdadsのfamidだけなので、このマージは基本的にdadsファイルにあるがkidsファイルにはないfamidの観測値を追加し、これをtempとして保存します。 次に、tempをdads2とマージし、tempはdads2ファイル内のすべての観測値に対してfamidを持つことになります。 これにより、結果のファイルには、kidsファイルに一致するレコードがない場合でも、dadsファイルからのすべての観測値が含まれることが保証されます。 その結果を以下に示します。 確かに、ファイルは、任意の一致する子供を持っていないお父さんカールのための観察が含まれています。 このステップで余分なコードを省略した場合、そのレコードはこのファイルに含まれていませんでした。

FAMID KIDNAME BIRTH AGE WT SEX INKID NAME INC DADS 1.00 Beth 1.00 9.00 60.00 f 1 Bill 30000.00 1 1.00 Bob 2.00 6.00 40.00 m 1 Bill 30000.00 1 1.00 Barb 3.00 3.00 20.00 f 1 Bill 30000.00 1 2.00 Andy 1.00 8.00 80.00 m 1 Art 22000.00 1 2.00 Al 2.00 6.00 50.00 m 1 Art 22000.00 1 2.00 Ann 3.00 2.00 20.00 f 1 Art 22000.00 1 3.00 Pete 1.00 6.00 60.00 m 1 Paul 25000.00 1 3.00 Pam 2.00 4.00 40.00 f 1 Paul 25000.00 1 3.00 Phil 3.00 2.00 20.00 m 1 Paul 25000.00 1 4.00 . . . 0 Karl 95000.00 1 5.00 Ted 1.00 4.00 35.00 m 1 . 0 5.00 Tess 2.00 2.00 18.00 f 1 . 0

5.同じ名前だが異なる情報を持つ3つの変数

以下に、お父さんと家族に関する情報を持つファイルがありますが、変数の名前をより詳しく見てくださ Dadsファイルにはinc98という変数があり、ファミリーファイルにはinc96、inc97、inc98という変数があります。 これらのファイルをマージして、SPSSが何をするかを見てみましょう。

DATA LIST LIST / famid * name (A4) inc98.BEGIN DATA.2 Art 220001 Bill 300003 Paul 25000END DATA.SAVE OUTFILE = "dads.sav".DATA LIST LIST / famid inc96 inc97 inc98.BEGIN DATA.3 75000 76000 770001 40000 40500 410002 45000 45400 45800END DATA.SAVE OUTFILE = "faminc.sav".GET FILE="dads.sav".SORT CASES BY famid.SAVE OUTFILE="dads2.sav".GET FILE="faminc.sav".SORT CASES BY famid.SAVE OUTFILE="faminc2.sav".MATCH FILES FILE="dads2.sav" /FILE="faminc2.sav" /BY famid.LIST.

その結果を以下に示す。 ご覧のように、変数inc98には、match FILESコマンドで最初に表示されたファイルであるdadsファイルのデータがあります。 同じ変数を持つファイルを照合すると、SPSSはMATCH FILESコマンドで最も早く表示されるファイルの値を使用します。

FAMID NAME INC98 INC96 INC97 1.00 Bill 30000.00 40000.00 40500.00 2.00 Art 22000.00 45000.00 45400.00 3.00 Paul 25000.00 75000.00 76000.00

この問題を解決する方法はいくつかあります。

ソリューション#1。 最も明白な解決策は、互いに競合しない元のファイル内の変数名を選択することです。 ただし、名前が既に選択されているファイルを受信することがあります。

ソリューション#2。 MATCH FILESコマンドで変数の名前を変更することができます(これは、一致を実行する前に変数の名前を変更します)。 これにより、以下に示すように、互いに競合しない変数名を選択することができます。

GET FILE="dads.sav".SORT CASES BY famid.SAVE OUTFILE="dads2.sav".GET FILE="faminc.sav".SORT CASES BY famid.SAVE OUTFILE="faminc2.sav".MATCH FILES FILE="dads2.sav" /RENAME=(inc98 = dadinc98) /FILE="faminc2.sav" /RENAME=(inc96 inc97 inc98 = faminc96 faminc97 faminc98) /BY famid.LIST.

以下に示すように、変数の名前は指定したとおりに変更されました。

FAMID NAME DADINC98 FAMINC96 FAMINC97 FAMINC98 1.00 Bill 30000.00 40000.00 40500.00 41000.00 2.00 Art 22000.00 45000.00 45400.00 45800.00 3.00 Paul 25000.00 75000.00 76000.00 77000.00

5.4 異なる辞書情報を持つ同じ変数

この問題は、上記で概説したものと同様です。 この例では、同じ名前と同じ情報を持つ2つの変数がありますが、それらに関連付けられている辞書情報は異なります。 この辞書情報は、値ラベルおよび/または変数ラベルを含むことができる。 上記の例と同様に、SPSSはMATCH FILESコマンドで最初にリストされているファイルから情報を取得します。 後のファイルの変数からの情報が失われたことを知らせるエラーまたは警告メッセージは発行されません。 この問題の解決策は、MATCH FILESコマンドの最初に、結果のファイルに必要な辞書情報を含むファイルをリストすることです。

5.5ADD FILESコマンドを実行しましたが、何も起こりませんでした

以下に示すようにADD FILESコマンドだけを実行すると、SPSSは何もしません。 ただし、データエディタの右下隅に「変換保留中」というメモが表示されます。

ADD FILES FILE="dads.sav" /FILE="moms.sav"

解決策:解決策は、executeコマンドまたは、listコマンドやcrosstabコマンドなど、変換の実行を強制するprocedureコマンドのいずれかを追加することです。

ADD FILES FILE="dads.sav" /FILE="moms.sav"execute.

Leave a Reply

メールアドレスが公開されることはありません。