このセクションでは、基本的なデータ処理のXファンクションのサンプルを説明します。ワークシートデータに直接アクセスするには、範囲表記をご覧下さい。
wcopy Xファンクションは、指定したワークシートの コピー を作成するのに使用します。
次のサンプルは、現在のワークシートを複製し、コピーしたワークシートをもつ新しいブックを作成します。
wcopy 1! [<new>]1!;
wrcopy Xファンクションは、あるワークシートから別のワークシートにセル範囲をコピーするのに使用します。 目的のワークシートのロングネームとして使用する元の行を指定できます。
次のスクリプトは、[book1]sheet1! の5から9行目をBook1のCopiedValuesというワークシートにコピーし(ワークシートが存在しなければ作成されます)、[book1]sheet1! の4行目の値を目的のワークシート[book1]CopiedValues!のロングネームに割り当てます。
wrcopy iw:=[book1]sheet1! r1:=5 r2:=10 name:=4 ow:=CopiedValues!;
列や行列オブジェクトのコピーは、列をコピーする と 行列をコピーする をご覧ください。
Originは、 reduce_ex, reducedup, reducerows, reducexyのようなデータ削減のXファンクションがあります。これらのXファンクションは、大きなデータセットから小さなデータセットを作成する異なる方法を提供します。 どれを選択するかは、持っている入力データの種類や出力したいデータの種類に依存します。
次のスクリプトは、Y値が複数X値のそれぞれに対して平均値となるよう新しくXY列を作成します。
reducedup col(B);
次のスクリプトは、3を係数として、アクティブな選択(XYのプロット属性とは関係なく、複数列やワークシート全体にできます。)を削減します。 これは、行2,3、行5,6を削除し、行1,4を残します。デフォルトで、削減された値は、新しいワークシートに入れられます。
reducerows npts:=3;
次のスクリプトは列Aの n 個毎の数字(下記例では5個)の平均を取り、各グループの平均を列Bに出力します。これは ave LabTalk関数と同じで、col(b)=ave(col(a),5)のように書くことができます。
reducerows irng:=col(A) npts:=5 method:=ave rd:=col(b);
wxt Xファンクションを使って、データ列を含む条件でワークシートから部分データを抽出することができます。
// サンプルデータファイルのインポート newbook; string fname$ = system.path.program$ + "samples\statistics\automobile.dat"; impasc; // 列のいくつかを使って範囲を定義 range rYear=1, rMake=2, rHP=3; type "Number of rows in raw data sheet= $(rYear.GetSize())"; // 条件文字列を定義し、同じブック内の // 新しく名前を付けたシートにデータを抽出 string strCond$="rYear >= 1996 and rHP<70 and rHP>60 and rMake[i]$=Honda"; wxt test:=strCond$ ow:="Extracted Rows"! num:=nExtRows; type "Number of rows extracted = $(nExtRows)";
次の行を変更して、既存のワークブックの新しいシートではなく、新しいワークブックに直接出力できます。
wxt test:=strCond$ ow:=[<new name:="Result">]"Extracted"! num:=nExtRows;
見て分かるように、前のコードとの違いは、<new> キーワードを持つ変数owの範囲表記のワークブックの部分を追加しています。(<new>修飾語、オプション、テンプレート、名前などにリンクとインデックスを表します。)
LabTalkは、文字列の比較に、ワイルドカードとして* と ? 文字を使います。以下のように、strCond を変更することができます。
string strCond$ = "rYear >= 1996 and rHP<70 and rHP>60 and rMake[i]$=*o*";
文字 oを使って、自動車のメーカすべてを表示できます。
N番目の行を削除するには、上記で述べたように、 reducerows Xファンクションを使って行います。
このサンプルでは、forループを使ってワークシート内のN番目の列毎に削除する方法を示しています。
int ndel = 3; // 必要に応じてこの数字を変更 int ncols = wks.ncols; int nlast = ncols - mod(ncols, ndel); // 右から左に削除する必要がある for(int ii = nlast; ii > 0; ii -= ndel) { delete wcol($(ii)); }
次のサンプルでは、 wsort Xファンクションを使って、ワークシート内のデータをネストソートする方法を示しています。
// 新しくブックを作成し、サンプルファイルをインポート newbook; string fname$ = system.path.program$ + "Samples\Statistics\automobile.dat"; impasc; // ベクターデータをセットアップして、列のネストとソート順を指定 // ソートネスト: 主キー 列2, 次にcol 1, その次にcol 3 dataset dsCols = {2, 1, 3}; // col2 を昇順、col 1を昇順、col 3を降順にソート dataset dsOrder = {1, 1, 0}; wsort nestcols:=dsCols order:=dsOrder;
Xファンクションwsplitは、1つのワークシートの列を複数シートに分割するのに使用されます。
以下のサンプルは、複数のCSVファイルをインポートし、全てのデータファイル内にあるAmplitudeデータをワークシートに出力します。さらに、等高線図の作図のためにこれらを統合し、行列として出力します。
// 新しいワークブックを作成 newbook; // 特定フォルダ内の全てのCSVファイルを探す string strPath$ = system.path.program$ + "Samples\Batch Processing\"; findfiles path:=strPath$ fname:=csvFiles$ ext:=csv; // 見つかったCSVファイルを、1つのワークシートにインポートする impCSV fname:=csvFiles$ // 見つかったすべてのCSVファイル options.Mode:=1 // 第2ファイルから、新たな列を開始 options.names.FNameToSht:=0 // ワークシート名の変更なし options.names.FNameToBk:=0 // ワークブック名の変更なし options.headerLines.SubheaderLines:=2 // 2行のサブヘッダオプション options.headerLines.LongNames:=1 // 第1サブヘッダ行はロングネーム options.headerLines.Units:=2; // 第2サブヘッダ行は単位 // ロングネームによりワークシートを分割 // 同じロングネームの列を同一ワークシートに出力する // すべての結果ワークシートを新たなワークブックひとつに出力 wsplit mode:=label label:=L; // ワークシートAmplitudeをアクティブにする page.active$ = Amplitude; // ワークシートデータを行列に直接変換する w2m; // Amplitudeデータの等高線図を作成する worksheet -p 226 contour;
分析およびプロットを行う際に、カテゴリーデータをアンスタックすることが望ましい場合があります。 スクリプトからこれを実行するには、 wunstackcol Xファンクションが最も便利な方法です。
この例では、カテゴリーデータがインポートされ、入力範囲を irng2で指定した特定のカテゴリーでデータをアンスタックします。 (カテゴリーで)表示されるデータは、入力範囲 irng1で参照されます。 この例では、列の範囲が直接入力となりますが、範囲変数が使われます。
// 自動車データをインポート newbook; string fpath$ = "\Samples\Statistics\Automobile.dat"; string fname$ = system.path.program$ + fpath$; impasc; // 列2に保存されている自動車のMakeを使って他のすべての列をアンスタック // 出力シートのコメント行に "Make" を配置 wunstackcol irng1:=(1, 3:7) irng2:=2 label:="Comments";
結果はアンスタックデータを持つ新しいワークシートです。
カテゴリーデータをスタックする操作は、アンスタック操作の逆を行うようなものです。元のデータセットにおいて、異なるグループに属したサンプルが、別々の列に格納されています。スタッキング後、サンプルはグループ情報を提供する追加の列とともに、同じ列の異なる行に格納されます。wstackcol を使用してワークシート列をスタックします。
以下のサンプルではまず、カテゴリーデータの入力されたワークブックを開きます。第1ワークシートがアクティブな状態でB,C,D列を行でスタックし、A列はその他の列として含めます。
// ワークブックを開く string strBook$ = system.path.program$; strBook$ += "Samples\Statistics\Body.ogw"; doc -o %(strBook$); // ワークシートMaleのB,C,D列をスタック // A列を他の列として含める // メソッドは行ごと wstackcol irng:=(2:4) tr.identifiers:={L} include:=1 method:=1;
結果は、ソースと同じブック内にスタックデータを持った新しいワークシートとして出力されます。
Xファンクションwpivot は、データ概要の把握、分析、比較、データ間の関係確認を素早く行うことがきます。これによりデータ情報を簡単に把握できます。
// 新しいブックを作成 // データファイルをインポート newbook; fname$ = system.path.program$ + "Samples\Statistics\HouseholdCareSamples.xls"; impExcel lname:=1; // ワークシート"HQ Family Mart"がアクティブなことを確認 // このワークシートのコピーを作成 page.active$ = "HQ Family Mart"; wcopy ow:=[<new>]"HQ Family Mart"!; // ピボットテーブルの行のソースはMake、 // 列ソースはBrand、データはNumber in shelf // 結果として、異なるブランドと型式ごとに // 棚の製品数が出力される wpivot row:=col(D) col:=col(F) data:=col(K) method:=sum total:=1 sort_total:=no sum:=1; // ソースデータシートをアクティブにする page.active$ = "HQ Family Mart"; // 行のソース、列のソース、データ列が同じピポッドテーブル // 合計の10%より小さい値の場合、 // それらを結合 // 結果シートでは、列の情報をユーザ定義パラメータとして格納 // 行の名前は、ソースシートの列ロングネームを使用 wpivot row:=col(D) col:=col(F) data:=col(K) method:=sum total:=1 sort_total:=no sum:=1 dir:=col threshold:=10 // 列を越えて10%より小さい値の場合、 // それらを結合 // 列の情報(列ロングネーム)をユーザ定義パラメータ行に出力 pos:=udl udlabel:=L;
Originのワークシートフィルタ (データフィルタ) は、列ベースのフィルタで、特定条件により行の削減が可能です。そして、削減されたデータは分析やグラフからは除かれます。3つのデータフォーマット(数値、テキスト、日付/時間)をサポートしています。LabTalkでは、wks.col (wks.col.filter, wks.col.filter$, wks.col.filterenabled, wks.col.filterprescript$, とwks.col.filterx$) オブジェクトにより、データフィルタの制御が可能です。フィルタの実行/再適用には、wks.runfilter() メソッドを使用します。
// ワークブックを作成し、データをインポート newbook; string fname$ = system.path.program$ + "Samples\Statistics\Automobile.dat"; impasc; // 1列目にデータフィルタをセット(数値) wks.col1.filter = 1; // フィルタ追加 wks.col1.filterx$ = year; // 既存の第1列を変数 "year"にセット // フィルタ条件を、1995から2000の間に設定 wks.col1.filter$ = "year.between(1995,2000)"; // 2列目にデータフィルタをセット(テキスト) wks.col2.filter = 1; // Add filter wks.col2.filterx$ = make; // 既存の第2列を変数 "make" としてセット // 事前スクリプトをセット wks.col2.filterprescript$ = "string strFavorite$ = GMC"; wks.col2.filter$ = "make = strFavorite$"; // フィルタクエリ文字列をセット // ワークシートフィルタを実行 wks.runfilter(); // 1列目のフィルタを無効化 wks.col1.filterenabled = 0; // フィルタを再適用 wks.runfilter();
ワークシート内にフィルタがあるかどうかを検出するには、wks.hasfilter()メソッドを使用することができます。
// ワークシートフィルタがある場合1を返し、そうでない場合は0を返す wks.hasfilter() = ;