Take Your Time

仕事や研究、コンピューターとの付き合い方

極力loopを使わない方法、kroneckerと条件式をつかったリファクタリング

例えば、労働者のある時点の給与w_tをもとにその労働者の給与の履歴{w_s}s=0,..,t-1を計算したいとする。履歴は、観察可能な給与にある定数をかけるとでてくるとする。
w_s = w_t*r[s]
しかしながらこのrが労働者の教育に依存するとすると、場合分けが必要となる。
この場合、Rではkroneckerと条件式()を使うといい。
これは実際のコードの一部。

W.h[1:36, ] <- kronecker(t(W.h[36,]), rep(1,36))*
      (kronecker(t(Ed.h == 1), Profile$dropout) + 
         kronecker(t(Ed.h == 2), Profile$hs) +
         kronecker(t(Ed.h == 3), Profile$anycol)+
         kronecker(t(Ed.h == 4), Profile$colgrad))

W.hはwage historyのN×36行列、Profileは教育別の各時点の給与と50歳時の給与との比率。こうして書けば、ループを使わずにW.h[36,]を元に教育別の給与歴を一瞬で計算できる。(...)が秀逸で、カッコ内が真なら1、偽なら0を返してくれる。