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