2012年11月21日水曜日

ExcelのVLOOKUP関数の紹介

Excelで2つのテーブルをマージして、マージしたテーブルの特定の列がほしいと考えた。Rのmergeを思いついたが、わざわざRを使うのも面倒そうなので、Excelでmergeのような関数はないかと調べてみたら、VLOOKUPという便利な関数があったので紹介しておく。マージというのは、あるテーブルのキーを基準にテーブルを結合するというものである。例えば次のようになる。

名前身長
Aさん170
Bさん165
Cさん173

名前体重
Aさん70
Cさん65
Bさん58

これらを名前をキーにしてマージすると以下のようになる。それぞれの体型が1つのテーブルとしてまとめられている。VLOOKUP関数では名前・身長の表から体重を含む表を参照し、体重列を横につけることを実現する。

名前身長体重
Aさん17070
Bさん16558
Cさん17365

さて、VLOOKUP関数の定義としては、次のようになる。

VLOOKUP(調べたい対象,範囲,列番号,論理値)

各引数について順に説明する。

  • 第1引数の「調べたい対象」は、第2引数の「探索範囲」でどこにあるかを調べたいものを入れる。
  • 第2引数の「探索範囲」はマージしたいテーブルと考えて差し支えない。通常、長方形状の範囲が選択されるはず。別シートの範囲を選択する場合は、sheet2!$A$1:$D$100のように!を使ってシート名を明記する必要がある。探索は左端の列から順に行う。
  • 第3引数の「列番号」は「探索範囲」で「調べたい対象」があった行の何列目を取り出したいかということを指定する。シートで何列目かではなく、探索範囲の何列目かを指定する必要がある。
  • 第4引数の「論理値」は完全一致のデータを探索する場合は、falseを指定すればよい。

上の例について考える。もし二つの表がsheet1とsheet2の「A1:B4の範囲(ヘッダも含めて)」にあったとすれば、sheet1のC2セルは次のように書けば、マージしたときと同等の値が得られる。A2の箇所はAさんを対象にしたものなので、Bさん、Cさんのマージ結果を得たい場合は、A3やA4とすればよい。

=VLOOKUP(A2,sheet2!$A$2:$B$4,2,false)

なお、一致するデータが複数あった場合は、先に見つかった方の結果のみが返ってくることに注意。

2012年11月18日日曜日

JavaScirptの繰り返し、条件分岐

for文とその中で用いられるであろう比較演算子もC言語と同じ。変数変更のためのインクリメント(i++)、デクリメント(i--)は用意されている。while文、switch~case文、break、continueもC言語と同じように使える。

条件分岐はif~else、if~else if~elseで実現する。C言語と同じと思ってよい。

論理演算子もC言語と同じく、&&(and)、||(or)、!(not)を利用することができる。

<SCRIPT language="JavaScript">
<!--
function mysum(from, to){
  var sum = 0;
  /*
    fromから始めてtoまでの整数の総和を計算する。
    to以下というのは比較演算子で実現する。
  */
  for( i=from ; i<=to ; i++ ){
    sum += i;
  }
  alert("合計 = " + sum);
}

/*
  入力された月の値に応じて季節を表示するというもの。
*/
function alert_season(){
  var mnt;
  mnt = prompt("1から12の整数を入力して下さい", "");
  var month = parseInt(mnt); // 整数として解釈させる
  switch(month){
    case 1:
    case 2:
    case 3:
      alert("春");
      break;
    case 4:
    case 5:
    case 6:
      alert("夏");
      break;
    case 7:
    case 8:
    case 9:
      alert("秋");
      break;
    case 10:
    case 11:
    case 12:
      alert("冬");
      break;
    default:
      alert("1~12の月が指定されていません。");
      break;
  }
}

/* 
  ナベアツがnum回アホになるときまでに数えた数を返す(ネタが古い!?)。
  indexOfは引数となる文字列が(""+i)という文字列にあれば、
  0以上の値(正確には位置を表す添字)が返されるようになっている。
  Javaと同じですね。
*/
function nabeatu(num){
  var i = 1;
  var counter = 0;
  while( true ){
    if( i % 3 == 0 || (""+i).indexOf("3") >= 0){ // or演算子の利用
      counter++;
    }
    if( counter >= num ){
      break;
    }
    i++;
  }
  alert(num + "回アホになるのに" + i + "まで数えました");
}

//-->
</SCRIPT>

2012年11月17日土曜日

FancyZoomの使い方

JavaScriptを用いると動きのあるWebページを作成することができます。紹介するFancyZoomというのは、名前から推測できる通り、ズームするという効果を要素に持たせることができるようになるライブラリです。画像に対してズームすることが多いのですが、リンク先をクリックして説明文をズーム画面で表示させることもできます。FancyZoomは非商用に限って無料で使えるそうです。個人的なページではタダということですね。以下、FancyZoomの導入手順について説明します。英語は簡単な説明なので、ここでは細かめに説明します。

  1. FancyZoomライブラリをダウンロードしてきます。ダウンロード先はこちらになります。instructionsと書かれた先の下にzipファイルのアイコンがあるので、それをクリックして保存します。
  2. ファイルを解凍します。トップディレクトリ(FancyZoom 1.1)の下に2つディレクトリができるのですが、_MACOSXではない方のFancyZoom 1.1というディレクトリを利用します(以下ではこのディレクトリをFZというディレクトリ名で表記します)。
  3. FZディレクトリをサーバのトップディレクトリにおきます。ただし、そういう権限が無い中で作業しないといけないかもしれません。そのような時は、ライブラリを使いたいhtmlファイルと同じ位置にFZディレクトリを置きましょう。トップディレクトリに置かない場合は、js-globalディレクトリ以下のFancyZoom.jsの53行目にある、
    var zoomImagesURI   = '/images-global/zoom/';
    をディレクトリの位置に書き換える必要があります。例えば、'./FZ/images-global/zoom/'と変更し、画像の位置を相対パスで表記することにします。これを行わないと、画像を拡大したときに左上にでる×マークの画像が正しい場所を示していないので、見栄えが悪くなります。
  4. ライブラリを利用したいhtmlファイルでライブラリが使えるようにしていきます。トップディレクトリにライブラリを置くことができるのであれば、以下のようになりますし、htmlファイルと同じ位置にFZディレクトリを置くのであれば、srcの値は相対パスで記述すればよいことになります。htmlファイルで書き込む場所はheadタグの内部になります。
    <script src="/FZ/js-global/FancyZoom.js" type="text/javascript"></script>
    <script src="/FZ/js-global/FancyZoomHTML.js" type="text/javascript"></script>
    
  5. <body>タグにonload="setupZoom()"を追加します。これはhtmlファイルをロードしたときにJavaScriptのsetupZoom()関数を実行せよということを意味しています。
  6. <a href="ズーム後に表示したい画像へのリンク"><img src="htmlファイルで表示する画像" /></a>のようにすれば作業完了。

その他、細かい仕様も載っていて、上と同じぐらい重要なことが書いてあります。

  1. ズームした画像の下にキャプションをつけるには、hrefと一緒にtitle="~"を追加します。
  2. hrefの最初の要素を利用して、位置やズームの表示位置を決めています。
  3. ズームしたくない画像があるのであれば、hrefと一緒にrel="nozoom"と書きます。
  4. ズーム機能を持たせられる画像はjpg、gif、png、bmp、tiffになります。
  5. 画像をクリックして拡大画像を表示するという使い方もありますが、テキストに拡大画像へのリンクを設定するという使い方もできます。

2012年11月16日金曜日

JavaScirptのルール、関数、配列の基本

最近Webページの作成や更新を行うことがあり、動きのあるページを作るニーズがあるかもということで、JavaScriptの学習を始めてみることにした。Webの開発においては、ロジックを書く言語はPython、Ruby、Perl、Javaなど多様な選択肢があるが、データベースはそれより選択肢が少なく、インタフェースに相当するJavaScirptは現状一択の状況らしいので、JavaScriptを学ぶ価値はあるものと考えている。ここでは基本的な注意事項や用語を中心についてメモしておく。

<SCRIPT>~</SCRIPT>の間にコードを記述する。language="JavaScript"として、スクリプトの中身がどのような言語で書かれているかを指定する必要がある。

<SCRIPT>~</SCRIPT>の内側はさらに<!-- ~ -->で挟む必要がある。SCRIPTタグに対応していないブラウザ対策として必要となる。

行末はセミコロン(;)が必要。

JavaScriptに対応していないブラウザとして<SCRIPT>~</SCRIPT>の後ろに<NOSCRIPT>~</NOSCRIPT>を付け加える。

JavaScriptのコードを実行するタイミングを指定するために用いられるのがイベントハンドラである。イベントハンドラ="実行するJavaScript"という形式で指定する。左辺の値の代表的なものには次のようなものがある。

  • onClick(要素をクリックしたとき)
  • onMouseOver(マウスを要素の上においたとき)
  • onLoad(ページが読み込まれたとき)

関数の書式は次の通り。関数名に使える文字は他の言語によくある仕様と同じ。i.e. 予約語を使うな、数字で始めるな、など。関数は<SCRIPT>~</SCRIPT>の間に記述すればよい。変数はvarをつけて宣言するが、省略してもOK。コメントはC言語と同じで、「//」と「/* ~ */」が利用できる。加減乗除、剰余の演算もC言語と同じようにできる。文字列の結合は"+"演算子を使う。

<SCRIPT language="JavaScript">
<!--
/*
複数行に渡るコメントを書いてみたらこんな感じになります。
複数行に渡るコメントを書いてみたらこんな感じになります。
複数行に渡るコメントを書いてみたらこんな感じになります。
*/
var x = 1; // グローバル変数宣言

function myfunc(){
  var s = 'S式'; // ローカル変数宣言
  alert('俺が' + s + 'だ!');
}
//-->
</SCRIPT>

配列の宣言は次のようになる。配列の先頭の添字は0からである。配列の要素に対し配列を入れることで2次元配列を作成することができる。

var ary = new Array(10);// 要素数10の配列
ary[0] = 4;
ary[1] = new Array(3); // 配列の配列の宣言方法
ary[1][0] = "Hello";

2012年11月13日火曜日

R言語のsubset関数の調査

とあるR使いとコードについて話をしたとき、subset関数について話が出た。データ操作でよく使われそうなものなので、どういう挙動か見てみることにする。

subset関数はベクトル、マトリックス、データフレームから条件を満たす行のみを抽出する。

使用方法は次のようになっている。

  • subset(x, ...)
  • subset(x, subset, ...)
  • subset(x, subset, select, drop = FALSE, ...)(マトリックスやデータフレームに対して)

引数は次のような意味をもつ。

  • xは部分集合を求めたいオブジェクト。ここではデータフレームなどのデータと思って差支えない。
  • subsetは残しておきたい要素、行の論理値表現。欠損値はfalseとみなされる。
  • selectはデータフレーム、マトリックスから抜き出したい列を選ぶ表現を書く。
  • dropは添え字オペレータ[で扱えるものにする。例えば1列のマトリックスはtrueに設定すればベクトル化されることになる。
  • ...にはさらに渡す引数や他のメソッドからの引数を与える。

subsetは総称的関数であり、マトリックス、データフレーム、ベクトルに対するメソッドが与えられている(リストも含む)。パッケージやユーザはさらにメソッドを追加することもできる。通常のベクトルであれば単にx[subset & !is.na(subset)]とすればよい。データフレームに対しては、引数subsetは行に対して働く。subsetはデータフレームで評価され、列は変数として(名前で)言及されることもある。引数selectはデータフレームとマトリックスに対するメソッドにおいてのみ存在する。最初に列名を対応する列番号に置き換え、得られた整数ベクトルを索引づけるために用いる。これにより、標準的な索引づけの慣習は、例えば列の範囲を簡単に特定するあるいは1列をドロップするといったことができるようにしている。引数dropはマトリックスとデータフレームに対して索引づけのメソッドに移される: マトリックスに対する既定の動作はそのような添字をつけるのとは異なる。因子は部分集合化した後には空の水準があるかもしれない: 使われていない水準は自動的に削除される。

返り値は、ベクトルであれば選ばれた要素を、データフレームやマトリックスでは選ばれた行と列を引数のxに似たオブジェクトで返す。

この関数はインタラクティブな使用を意図した便利な関数である。プログラミングでは"["のような標準的な部分集合化する関数を利用するのがよい。特に普通ではない評価をするような部分集合を求める引数では、思わぬ結果を引き起こすことになるかもしれない。

2012年11月7日水曜日

変動係数

変動係数は標準偏差を平均で割ったものである。標準偏差は不偏分散の平方根である。つまり次のような式で書くことができる。

変動係数

変動係数は、単位が異なるばらつきを、単位なしに統一して見る指標と言える。例えば、4人の野球のピッチャーが投げた球の球速を130kn/h、136kn/h、140kn/h、150kn/hとしたときの変動係数と、4人のテストの受験結果が65点、68点、70点、75点であったときの変動係数は同じである。なお、変動係数は観測値が0以下の値をとらないことを前提としていることに注意。

2012年11月5日月曜日

2012年10月の学習記録

2012年10月に学習した主な本一覧。

入門・演習 数理統計(演習問題40問)
6章の推定の問題は全体的に難しい。なかなか進まぬ。特にUMVUEの問題が難しい。
カウントデータの統計解析(pp.1~70)
カウントデータというのは、平たくいうと離散型のデータです。例えば2項分布が2つあって、そこから成功確率に差があるか検定するということをしています。この本で学んだことの応用先は製薬の統計になるのかな?
基礎からのMySQL(pp.231~500、読了)
商用ならともかく、組織内でちょっとしたものを動かすという程度であれば、この本で十分なのではないかと。
これなら分かる最適化数学(pp.201~234)
非線形計画、DPなど。学習を終えてほぼ1月経って印象が薄くなってしまった感が。
HTML/XHTML&スタイルシートレッスンブック(pp.1~232)
HTMLのデザインについて。JavaScript無しでもそこそこ綺麗なウェブページが作成できるんですね。基本的なHTMLのお作法やCSSを知らなかったので、よい勉強になっています。
パーフェクトPHP(pp.1~170)
PHPの学習の続きということで少し読んでみたのですが、あまりしっくりこない...オブジェクト指向は別言語で勉強することにしようかと。
JavaScript入門講座(pp.1~228)
Webページの作成の勉強の一環として10月に読んだ本その2。動的なWebページを作る方法について、軽く学んでいます。

その他、英文ドキュメント翻訳、NHK実践ビジネス英語、TopCoderの過去問を解くなど。

フォロワー

ページビューの合計