ワークシートデータの操作


このセクションでは、基本的なデータ処理の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() = ;