PAGE TOP

index
テーブル結合

項目 サンプル
2つのテーブルを横につなげたい(最大行に合わせる)
C1C2
1a1
2a2
3a3
4a4

C3C4
53
134
92
91
185
36
   =>   
C1C2C3C4
1a153
2a2134
3a392
4a491
-1 185
-1 36
2つのテーブルを横につなげたい(最小行に合わせる)
C1C2
1a1
2a2
3a3
4a4

C3C4
53
134
92
91
185
36
   =>   
C1C2C3C4
1a153
2a2134
3a392
4a491
2つのテーブルをキーで結合したい
C1C2
1s10
2s21
2s22
3s30
4s40
4s40
4s40
5s50
5s60

CC1CC2
1s1
2s2
3s3
4s4
   =>   
C1C2CC2
1s10s1
2s21s2
2s22s2
3s30s3
4s40s4
4s40s4
4s40s4
片方のテーブルを列別、下端で追加したい
C1C2C3
1s10t10
2s21t21
2s22t22
3s30t30
4s40t40
4s40t40
4s40t40
5s50t50
5s60t60

CC1CC2
1s1
2s2
3s3
4s4
   =>   
C1C2C3CC2
1s10t10
2s21t21
2s22t22
3s30t30
4s40t40
4s40t40
4s40t40
5s50t50
5s60t60

C1C2C3CC2
1s1
2s2
3s3
4s4
   =>   
C1C2C3CC2
1s10t10
2s21t21
2s22t22
3s30t30
4s40t40
4s40t40
4s40t40
5s50t50
5s60t60
1s1
2s2
3s3
4s4

2つのテーブルを横につなげたい(最大行に合わせる)

[結果]
C1C2
1a1
2a2
3a3
4a4

C3C4
53
134
92
91
185
36
   =>   
C1C2C3C4
1a153
2a2134
3a392
4a491
-1 185
-1 36
[VAPScript]
N = 4;
c1("C1") = {1:N};
c2("C2") = paste("a",c1);
table = cbind(c1,c2);
N2 = 6;
c3("C3") = runif(N2,1,20);
c4("C4") = shuffle({1:N2});
table2 = cbind(c3,c4);
//
defRow = cbind(-1,""); // 補間用レコード
defRow2 = cbind(-1,-1); // 補間用レコード
if (nrow(table) < nrow(table2)) {
  table = rbind(table,defRow);
} else if (nrow(table) > nrow(table2)) {
  table2 = rbind(table2,defRow2);
}
result = cbind(table,table2);
[解説]
テーブル同士を横に結合するには cbind() 関数を利用します。

cbind()の 結合では、テーブルの最大行数に合わせて、 行数の少ないテーブルの末尾行を充填します。

ここでは、充填のために、補間レコード(defRow)を用意します。


2つのテーブルを横につなげたい(最小行に合わせる)

[結果]
C1C2
1a1
2a2
3a3
4a4

C3C4
53
134
92
91
185
36
   =>   
C1C2C3C4
1a153
2a2134
3a392
4a491
[VAPScript]
N = 4;
c1("C1") = {1:N};
c2("C2") = paste("a",c1);
table = cbind(c1,c2);
N2 = 6;
c3("C3") = runif(N2,1,20);
c4("C4") = shuffle({1:N2});
table2 = cbind(c3,c4);
//
if (nrow(table) < nrow(table2)) {
  table2 = sel(row={1:nrow(table)},table2);
} else if (nrow(table) > nrow(table2)) {
  table = sel(row={1:nrow(table2)},table);
}
result = cbind(table,table2);
[解説]
テーブル同士を横に結合するには cbind() 関数を利用します。

テーブルの最小行に合わせて切り詰めるために、 行数の多いテーブルを切り詰めて、cbind()で結合します。
テーブルの切り詰めにはsel(row=,)関数を用います。


2つのテーブルをキーで結合したい

[結果]
C1C2
1s10
2s21
2s22
3s30
4s40
4s40
4s40
5s50
5s60

CC1CC2
1s1
2s2
3s3
4s4
   =>   
C1C2CC2
1s10s1
2s21s2
2s22s2
3s30s3
4s40s4
4s40s4
4s40s4
[VAPScript]
c1("C1") = {1,    2,    2,    3,    4,    4,    4,    5,    5    };
c2("C2") = {"s10","s21","s22","s30","s40","s40","s40","s50","s60"};
table = cbind(c1,c2);
cc1("CC1") = {1,   2,   3,   4   };
cc2("CC2") = {"s1","s2","s3","s4"};
table2 = cbind(cc1,cc2);
//
key = 1;
key2 = 1;
result = merge(table, table2, "00", key, key2);
[解説]
テーブル同士をキー列で結合するには、merge()関数を用います。
両方のテーブルに存在するキー同士で結合するには、merge()の第三引数に "00" を指定します。


片方のテーブルを列別、下端で追加したい

[結果]
C1C2C3
1s10t10
2s21t21
2s22t22
3s30t30
4s40t40
4s40t40
4s40t40
5s50t50
5s60t60

CC1CC2
1s1
2s2
3s3
4s4
   =>   
C1C2C3CC2
1s10t10
2s21t21
2s22t22
3s30t30
4s40t40
4s40t40
4s40t40
5s50t50
5s60t60

C1C2C3CC2
1s1
2s2
3s3
4s4
   =>   
C1C2C3CC2
1s10t10
2s21t21
2s22t22
3s30t30
4s40t40
4s40t40
4s40t40
5s50t50
5s60t60
1s1
2s2
3s3
4s4
[VAPScript]
c1("C1") = {1,    2,    2,    3,    4,    4,    4,    5,    5    };
c2("C2") = {"s10","s21","s22","s30","s40","s40","s40","s50","s60"};
c3("C3") = {"t10","t21","t22","t30","t40","t40","t40","t50","t60"};
table1 = cbind(c1,c2,c3);
cc1("CC1") = {1,   2,   3,   4   };
cc2("CC2") = {"s1","s2","s3","s4"};
table2 = cbind(cc1,cc2);
//
key1 = 1;
key2 = 1;
defRow1(titles(table1)) = cbind(-1,"",""); // 補間用レコード
defRow2(titles(table2)) = cbind(-1,""); // 補間用レコード
defRow1_ = defRow1(sel(not row=key1,{1:ncol(defRow1)}));
defRow2_ = defRow2(sel(not row=key2,{1:ncol(defRow2)}));
table1_ = cbind(table1, rep(defRow2_,ncol(table1)));
idxList2 = sel(not row=key2,{1:ncol(table2)});
table2_ = cbind(table2(key2),rep(defRow1_,ncol(table2)),table2(idxList2));
result = rbind(table1_, table2_);
[解説]
別テーブルを別列として、結合する場合です。

それぞれ、お互いの列を補間レコードより列を追加して、 テーブルの列を揃えておき、 rbind() 関数でお互いのテーブルを結合します。