一所懸命に手抜きする

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

Rで連想配列的なことをしたい(1)

連想配列

 awk を使っていた頃、連想配列に随分お世話になりました。配列の場合 data(1)=“ABC” のようにインデックスは数字ですが、連想配列の場合は data[‘大和’]=‘やまと’ のように文字列もインデックスとすることができます。(カッコや引用符の違いはここでは気にしないでください。)
 言語によって多少の差異はあるもののディクショナリやハッシュ、マップなどというものが連想配列のようなものです。
 Rでは標準では連想配列に当たるものはないようですが、{hash}というライブラリ( CRAN - Package hash )により実現できそうです。
 とは言っても、だいそれたことをしないならばライブラリをインストールせずともなんとかできそうな気がします。

相互変換しないなら簡単

 キー → 値 の集合体を連想配列もどきと割り切れば、コラム名 → 値、というデータフレームの構造そのものと見なせるかもしれません。

データフレームの例 df
S001 S002 S003 S004
支社番号 支社名 支店番号 支店名

データフレームのラベルと値の対応を連想配列として使用

  1. 連想配列の値をコラムの値、連想配列のキーをコラム名とするデータフレームを作成する。
  2. コラムの値は c() 関数 などで与えることができる。
  3. キーの値は names()<-c() などの形で与えることができる。
  4. データフレーム名[[‘キー名’]] で連想配列に格納された値を得られる
Rにおいて連想配列代わりにデータフレームを利用する例
# 連想配列代わりにデータフレーム作成
  df<-c("支社番号","支社名","支店番号","支店名")# Value
  names(df)<-c("S001","S002","S003","S004")# Key
## S001        S002     S003       S004 
##"支社番号"   "支社名" "支店番号"   "支店名" 

# 例 1
  df['S001']
##  S001 
##"支社番号" 

# 例 2
  df[['S001']]
##[1] "支社番号"

 例 1 はリストで返していますが、実用上はリストの値が必要でしょうから、例 2 がちょうどいい感じです。
 S001という文字列で支社番号という値を呼び出せました。
 このやり方は難しいことはできないかもしれませんが、手軽だと思います。

この方法は値からラベルへの対応はできません

 この方法ではラベルに割り振られた文字列からデータフレーム要素に割り振られた文字列を呼び出すことはできても逆はできません。
 df[[‘支社番号’]]としても"S001"とはなりません。

  df[['支社番号']]
##df[["支社番号"]] でエラー:  添え字が許される範囲外

 この点はご注意を。f:id:a_habakiri:20161123165520p:plain:w2