一所懸命に手抜きする

デスクワークばかりのスポーツ嫌いで50歳も過ぎ、いよいよ足腰に衰えを感じつつある昨今。

RデータフレームのヘッダをASのテキスト記述で置き換えるユーザー関数 ReplaceASHeader連想配列的なこと(3)

まずは復習から

AS400にも日本語対応の項目別名的なものがあるが取得するのは難しい

当社のAS400テーブル(MASTER/OFFICE)の情報を DSPFMT で見てみると、日本語記述があります…
項目名 桁数 属性 バイト 開始 終了 テキスト
S001 3 0 B 2 1 2 支社番号
S002 10 O 10 3 12 支社名
S003 3 0 B 2 13 14 支店番号
S004 10 O 10 15 24 支店名
でも、AS400データ転送なりSQLなりでデータを取得すると…
S001 S002 S003 S004
1 10 札幌 11 札幌
2 20 東京 21 大手町
3 20 東京 22 秋葉原
4 20 東京 23 横浜

ヘッダとしてテキスト記述を取得することは簡単ではありません。

ユーザー関数 GetASHeader()でテキスト記述を取得し手動でヘッダ置き換え

ユーザー関数 GetASHeader()(http://a-habakiri.hateblo.jp/entry/2017/02/10/000000)でテキスト記述を取得して…
1 2 3 4
S001 S002 S003 S004
支社番号 支社名 支店番号 支店名
GetASHeader()で取得したヘッダに手動で置き換えました
支社番号 支社名 支店番号 支店名
1 10 札幌 11 札幌
2 20 東京 21 大手町
3 20 東京 22 秋葉原
4 20 東京 23 横浜

が、項目を間引いて抽出した場合にはそのままヘッダを置き換えることはできません。

データフレームのヘッダをASのテキスト記述で置き換えるユーザー関数 ReplaceASHeader()

ユーザー関数 ReplaceASHeader()

ユーザー関数 ReplaceASHeader()
ReplaceASHeader<- function(.Rdf,.AsTable)
    # ユーザー関数 GetAS400()、GetASHeader()が必要。
    # .Rdf   :  R のデータフレーム
    # .AsTable :  .Rdfの元になっているASのテーブル
    #        ライブラリ名.テーブル名 の形で
{
    # ASからヘッダとテキスト記述を取得し連想配列風に格納
        Hd<-GetASHeader(.AsTable,"")
        ASHeader<-Hd$COLUMN_HEADING
        names(ASHeader)<-Hd$COLUMN_NAME

    # Dataframeのヘッダを連想配列的に置き換え
    for (i in 1:ncol(.Rdf)){
            names(.Rdf)[i]<-as.character(ASHeader[names(.Rdf)[i]])
                            }
    return(.Rdf)
}

 この関数は、元となっているAS400のテーブル情報から 連想配列 ASHeader を作ります。
 MASTER/OFFICE の例で言うと テキスト記述(“支社番号”,“支社名”,…)が値にセットされ、"S001",“S002"…という通常の項目名がASHeaderのラベル(連想配列のキー)になります。たとえば、ASHeader[‘S001’]は"支社番号"が格納されています。
 次に、データフレームのコラム名("S001”,“S002"など)を、連想配列もどきを用いて順にテキスト記述("支社番号”,“支社名”,…)に置き換えています。

注意
  1. RODBC、ユーザー関数 GetAS400()、GetASHeader() が必要です。
  2. ライブラリ名/テーブル名 ではなく、 ライブラリ名.テーブル名 の形で指定して下さい。

ユーザー関数 ReplaceASHeader() の使用例

ユーザー関数 ReplaceASHeader()で記述欄をヘッダとして取得する例
# ASからSQLでデータを取得してサンプルデータフレームとする
(D<-GetAS400("Select S002,S003,S004 from MASTER.OFFICE limit 1"))   
  S002 S003 S004  
1  札幌  11 札幌
# データフレームのヘッダを書き換え
(ReplaceASHeader(D,"MASTER.OFFICE"))
  支社名 支店番号 支店名  
1   札幌    11  札幌