No.22227 R カラム数・カラム名が異なる複数ファイルの、行方向での結合  【明石】 2016/12/01(Thu) 22:10

青木先生,
いつもお世話になり,ありがとうございます,明石と申します。

Rプログラムについて,ご教示いただきたいことが出てきました。

何卒どうぞ,よろしくお願いいたします。

ーーー

データフレームの行方向での結合 rbind()関数を適用できる前提条件は,
カラム数・カラム名の並びが同一であることは理解しております。

カラム数・カラム名が異なる複数ファイルの,行方向での結合について
ご教示をいただければ大変に助かります。

結合対象のファイル名は,fllenames[n]のベクトルに格納されているとします。

素人考えですが,以下のようにやればよいのかと,思いを巡らせている段階です。

・まず,fllenames[1]のファイル名で読み込み,データフレームdat1に格納します。

・次に,fllenames[2]のファイル名で読み込み,データフレームdat2に格納します。

・dat1のカラム名と,dat2のカラム名とを比較して,
 rbindができるように,dat1とdat2のカラム名を整形してあわせる(※)。

・これを,逐次的に,fllenames[n]まで,すべてのファイル名について行う

言葉ではさらりと書きましたが,※ の箇所の具体的な手順を書き出すことができません。

もっと良い方法があるように思います。

もし可能ならば,具体的なRプログラムをお示ししていただき,
ご教示をいただければ大変に助かります。

何卒どうぞ,よろしくお願い申し上げます。

失礼いたします。

No.22228 Re: R カラム数・カラム名が異なる複数ファイルの、行方向での結合  【青木繁伸】 2016/12/02(Fri) 09:05

具体的によくわからないけど,merge でできそうに思いますが?

No.22229 Re: R カラム数・カラム名が異なる複数ファイルの、行方向での結合  【明石】 2016/12/02(Fri) 09:56

青木先生,
いつもお世話になり,ありがとうございます,明石と申します。

早々にご教示をいただきまして,誠にありがとうございました。

「転置させて,カラム名をキーにしてmergeをする」という意味と理解しました。

これだけでも貴重な手がかりです。
これを手がかりにして,検討をしてみます。

分かりにくい,つまらない質問で,大変に申し訳ございませんでした。
以降,気をつけます。
失礼いたします。

No.22230 Re: R カラム数・カラム名が異なる複数ファイルの、行方向での結合  【青木繁伸】 2016/12/02(Fri) 11:15

具体例を示してくれればよいのだけど?
merge は(大部分が)同じ個体についてのデータフレームをマージするのが目的。
「カラム数・カラム名が異なる複数ファイル」というのは,全く別の個体のデータですか(普通はそんなのは考えられないけど)。
もしカラム名の重複がないデータなら,両者に同じカラム名(以下では id)で値の重複もないカラムを追加して,all=TRUE で merge すればよい。
a = data.frame(id=1:5, x=1:5*3, y=(1:5)^2)
a
b = data.frame(id=11:20, z=runif(10))
b
merge(a, b, all=TRUE)
実行例
> a = data.frame(id=1:5, x=1:5*3, y=(1:5)^2)
> a
id x y
1 1 3 1
2 2 6 4
3 3 9 9
4 4 12 16
5 5 15 25
> b = data.frame(id=11:20, z=runif(10))
> b
id z
1 11 0.45929778
2 12 0.03272818
3 13 0.51413244
4 14 0.07282785
5 15 0.78663924
6 16 0.12525008
7 17 0.87019710
8 18 0.37075708
9 19 0.13116714
10 20 0.44714621
> merge(a, b, all=TRUE)
id x y z
1 1 3 1 NA
2 2 6 4 NA
3 3 9 9 NA
4 4 12 16 NA
5 5 15 25 NA
6 11 NA NA 0.45929778
7 12 NA NA 0.03272818
8 13 NA NA 0.51413244
9 14 NA NA 0.07282785
10 15 NA NA 0.78663924
11 16 NA NA 0.12525008
12 17 NA NA 0.87019710
13 18 NA NA 0.37075708
14 19 NA NA 0.13116714
15 20 NA NA 0.44714621

No.22231 Re: R カラム数・カラム名が異なる複数ファイルの、行方向での結合  【明石】 2016/12/03(Sat) 09:45

青木先生,
いつもお世話になり,ありがとうございます,明石と申します。

ご親身にご相談にのってくださり,誠にありがとうございます。
改めて御礼を申し上げます。

やりたいことをどのようにお伝えすればよいのか,色々と考えており,
ご返信が遅くなり,申し訳ございませんでした。

青木先生がお書きになられたことは,よく理解できました。
ありがとうございます。

私がやりたいと思うことは,
個体〜観測変数 というデータの結合ではなく,
データベースから出力した帳票類のデータファイルの結合です。

入力ファイルが3つからなる簡単な例示を,添付画像でお示しをします。
ファイル1の項目は,v1,v2,v3
ファイル2の項目は,v1,v2,v4
ファイル3の項目は,v2,v3,v5

これら3つのファイルを行方向に結合したいのですが,
カラム名が一致しないために,単純にはrbindが適用できません。これが悩みです。

共通する項目については,それを利用し,
共通しない項目については,右側の列に追加しながら,
行方向に結合します。

データがない箇所は,NAで埋めます。

結果として,
行方向の数は,入力ファイルの行数の和
列方向の数は,入力ファイルのカラム名の和集合
となります。

これがやりたいことです。

先の投稿では,説明不足で申し訳ございませんでした。
どうぞ,よろしくお願い申し上げます。


No.22232 Re: R カラム数・カラム名が異なる複数ファイルの、行方向での結合  【青木繁伸】 2016/12/03(Sat) 13:18

なので,merge を使えばできるでしょう?
> file1 = data.frame(v1=rep(1,5), v2=rep(1,5), v3=rep(1,5))
> file2 = data.frame(v1=rep(2,5), v2=rep(2,5), v4=rep(2,5))
> file3 = data.frame(v2=rep(3,5), v3=rep(3,5), v5=rep(3,5))

> file1$id = 1:5 # ユニークな値を取る変数を付加する
> file2$id = 1:5 + 10 # 不要な場合もあるが
> file3$id = 1:5 + 20 # 間違いを防ぐためには必須

> file1
v1 v2 v3 id
1 1 1 1 1
2 1 1 1 2
3 1 1 1 3
4 1 1 1 4
5 1 1 1 5
> file2
v1 v2 v4 id
1 2 2 2 11
2 2 2 2 12
3 2 2 2 13
4 2 2 2 14
5 2 2 2 15
> file3
v2 v3 v5 id
1 3 3 3 21
2 3 3 3 22
3 3 3 3 23
4 3 3 3 24
5 3 3 3 25

> a = merge(merge(file1, file2, all=TRUE), file3, all=TRUE)
> a = a[,c("v1", "v2", "v3", "v4", "v5")] # 列順を決める必要があるならこれを追加
> a
v1 v2 v3 v4 v5
1 1 1 1 NA NA
2 1 1 1 NA NA
3 1 1 1 NA NA
4 1 1 1 NA NA
5 1 1 1 NA NA
6 2 2 NA 2 NA
7 2 2 NA 2 NA
8 2 2 NA 2 NA
9 2 2 NA 2 NA
10 2 2 NA 2 NA
11 NA 3 3 NA 3
12 NA 3 3 NA 3
13 NA 3 3 NA 3
14 NA 3 3 NA 3
15 NA 3 3 NA 3
複数のデータフレームのマージは,
a = read.table(filenames[1])
for (i in 2:n) {
a = merge(a, read.table(filenames[i]), all=TRUE)
}
のようにやる。

No.22233 【御礼】 Re: R カラム数・カラム名が異なる複数ファイルの、行方向での結合  【明石】 2016/12/03(Sat) 17:02

青木先生,
いつもお世話になり,ありがとうございます,明石と申します。

青木先生が「mergeでできる」とおっしゃった意味を,納得し,理解できました。

今回も助けていただきました。
心から御礼を申し上げます。
ありがとうほざいました。

失礼いたします。

No.22234 Re: R カラム数・カラム名が異なる複数ファイルの、行方向での結合  【明石】 2016/12/04(Sun) 08:44

青木先生,
いつもお世話になり,ありがとうございます,明石と申します。

おさらいをしていて,追加質問です。
どうぞ,よろしくお願いいたします。

私は,データベース操作言語のSQLを利用していますので,
Rのmergeも,その理解でおりました。

結合の種類(内部,左外部,右外部,完全外部)に応じた指定方法がありますが,
結合キーは必須だと思っていました。

青木先生からご教示いただきました方法では,結合キーの指定がないことに,
驚きました。

Rのmergeは,SQLの結合だと思っていた私には,
このような使い方があることを,まったく知りませんでした。

追加質問です。

> file1$id = 1:5 # ユニークな値を取る変数を付加する
> file2$id = 1:5 + 10 # 不要な場合もあるが
> file3$id = 1:5 + 20 # 間違いを防ぐためには必須

idを付加する場合,しない場合について,
私なりに色々と実験をしましたが,この意味合いが理解できません。

ご説明をいただけますと,大変に助かります。
どうぞ,よろしくお願いいたします。

色々とありがとうございます。

No.22235 Re: R カラム数・カラム名が異なる複数ファイルの、行方向での結合  【青木繁伸】 2016/12/04(Sun) 11:18

結合キーは,R が自動で指定します
両者に共通の列です
今のような場合には複数のファイルを指定することもあり,id 列を付加することで,面倒な処理を避けることができるでしょう
id 列を付加しないと,思いがけない結果になりびっくりすることになります
以下の例を吟味するとよいでしょう(file2 が前の例と異なります)
file1 = data.frame(v1=rep(1,5), v2=rep(1,5), v3=rep(1,5))
# file2 = data.frame(v1=rep(2,5), v2=rep(2,5), v4=rep(2,5))
file2 = data.frame(v1=rep(1,5), v2=rep(1,5), v4=rep(2,5))
file3 = data.frame(v2=rep(3,5), v3=rep(3,5), v5=rep(3,5))
file1
file2
file3
a = merge(merge(file1, file2, all=TRUE), file3, all=TRUE)
a = a[,c("v1", "v2", "v3", "v4", "v5")] # 列順を決める必要があるならこれを追加
a

No.22236 Special Thanks(R カラム数・カラム名が異なる複数ファイルの、行方向での結合)  【明石】 2016/12/04(Sun) 12:13

青木先生,
いつもお世話になり,ありがとうございます,明石と申します。

何度も何度もご丁寧にご教示をいただきまして,誠にありがとうございました。

おかげさまで理解できました。

新しい追加拡張パッケージが沢山ありますが,
baseの基本機能を正しく理解することで,対応できることが多いなと,
改めて,Rはよく設計されていると感心しました。

心から御礼を申し上げます。
失礼いたします。

● 「統計学関連なんでもあり」の過去ログ--- 048 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る