Datasets

概要

datasetは基本的なOriginオブジェクトであり、数値やテキストの値を含むことができる1次元配列です。

  • データセット内の個々の値は要素と呼ばれます。
  • データセット内の各要素は1から始まるインデックス番号でアクセスできます。インデックスが0から始まるC言語の慣例とは異なりますので注意してください。新しいバージョンでは、最後の要素のインデックスは0です。
  • Originプロジェクトの各データセットには一意の名前が付けられています。
  • データセットには異なるデータ型が含まれている場合があります。

データセットは、ワークシートの列や1つ以上のデータプロットに関連付けられることが多いです。 データセットが削除されると、関連するワークシート列とデータプロットも削除されます。

データセットもLabTalk変数であるため、プロジェクトに属するか、ローカル変数として宣言することができます。Originでサポートされているデータセットのタイプは次の通りです:

ColumnまたはMatrixオブジェクト:ワークシートの列または行列シートの行列オブジェクトに関連付けられているデータセット。

ルーズデータセット:ワークシートまたは行列シートに関連づけられていないデータセット。

一時データセット:ルーズデータセットの一種。一時データセットストレージとして使用されます。Originは、_tempのようにアンダースコア("_")文字で始まる名前の一時データセットを作成します。 プロジェクトを保存するか、グラフページを印刷/コピーすると、元の一時データセットが削除されます。ユーザーが作成した一時データセットは、プロジェクトが閉じられたとき、または新しいプロジェクトが開かれたときに削除されます。

既存のデータセットの名前を表示するには、 List s コマンドを使用します。

データセットの作成

ワークシートの列と行列シートの行列オブジェクトは自動的にデータセットオブジェクトとして設定され、col()またはmat()でアクセスできます。例えば、

  • col(1) は第1列を表します。
  • col(A) はAというショートネームの列を表します。
  • col("Amplitude") はAmplitudeというロングネームの列を表します。
  • mat(1) はアクティブな行列シート内の第1行列オブジェクトを指します。

存在しない列または行列に値を代入/出力すると、対応する列または行列オブジェクトが自動的に追加されます。例えば、

wks.ncols = 3; // アクティブなシートを3列のみに設定
col(4)={1,2,3}; // ワークシートに4番目の列が自動敵に追加される

ルーズデータセットを作成する方法は3つあります:

  • [LabTalk:Dataset_(command)|dataset command]] で宣言する
  • Create (Command)を使用する
  • 代入を使用して自動作成

データセットの宣言とDataset -a オプション

-aオプションを使用せずにデータセットを宣言すると、数値(Double)としてのみ作成されます。文字と数値型のデータセットを作成するには、-aオプションを追加します。

サンプル

// 数値データセットを宣言して初期化
Dataset ds1 = {1,2,3};
ds1[1]= ; //最初の要素の値を取得
type $(ds1); //すべての数値要素を表示

// 文字と数値型のデータセットを宣言
dataset -a vv;
vv=data(1,10);// vvに1,2, ...10と代入。要素数は10個
vv[2]$="Beta"; // 2番目の要素を文字(テキスト)に変換)
vv[2]$= ; // 2番目の要素の文字を取得
type $(vv); //全ての数値要素の値を表示。文字は -- と出力
vv[0]$="Bye"; // vv[10]$="Bye"として保存 
vv[0]$= ; //最後の要素の文字を取得。vv[10]$と同様

// 代入結果としてルーズデータセットmydata1が作成される
mydata1 = col(1); // mydata1の第1列に値を代入
type $(mydata1); //全ての数値要素を表示


データセットの削除

LabTalkコマンドdeleteを使用してデータセットオブジェクトを削除します。これはルーズ/一時データセットや、range、col()、mat()などで作成されたデータセットに対して動作します。 Note: OriginのLabTalkコマンドは、一意である限り短縮表記ができます。例えば、deletedelと短縮表記できます。

//列の削除
del col(B); 

//範囲の削除
range r3=3; //アクティブなシートの3番目の列
del r3; //r3で参照されるデータセットを削除
del -ra r3; //範囲変数を削除

//データセットの削除
dataset ds1={1,2,3};
list s; //全てのデータセットを一覧表示。Session: partのds1を参照のこと
del ds1; // データセットを削除
del -al ds1 //変数を削除
list s;


データセットが宣言なしで作成された場合、それはプロジェクト変数となります。データセットはプロジェクトファイルと一緒に保存されます。

mydata1 = data(1,30);

データセットが宣言付きで作成された場合、それはセッション変数となります。現在のOriginセッションが閉じられると、この値は消えてしまいます。

dataset mydata2 = data(1,100);

スクリプトウィンドウで、「ツール:変数...」を選択するか、"edit"コマンドを実行して、すべての変数とそのスコープ(型)を表示するダイアログを開きます。変数を削除するための削除ボタンがあります。

サイズの取得と設定

Origin 8以前は、データセットのサイズを設定して取得するには、データセット名を指定してsetとgetコマンドを使用する必要がありました。Origin 8以降では、次の2つの方法を使用できます。

  • GetSize()
  • SetSize(int nSize)

これらはベクトルベースのOriginCクラスの一部であり、LabTalkデータセットによって継承されます。これらのメソッドを使用するには、Range型またはDataset型の変数が必要です。例:

Dataset ds1 = {1,2,3};
for( int ii = 1 ; ii <= ds1.GetSize() ; ii++ )
{
  ds1[ii]= ds1[ii]^2;
};
type $(ds1);

宣言なしで代入によって作成されたデータセットに対して、次のメソッドを使用することはできません。

temp = col(a); //tempは代入によって作成される
temp.GetSize()=; // 結果は -- となる

代わりに、まずDatasetオブジェクトを宣言します。

Dataset temp = col(a); //tempの宣言と初期化
// データセットが小さすぎない場合
if( temp.GetSize() < 50 )
   // これを大きくする
   temp.SetSize(366);
temp.GetSize()=;

データセットへのアクセス

ワークシートおよび行列内のデータセットには、次の方法でアクセスできます。

  1. 範囲変数
  2. Col() または Mat() 関数と WCol() 関数
  3. Cell()関数
  4. 置換表記
  5. データセット名

範囲変数

範囲変数は、ワークシート、グラフ、行列のデータにアクセスするために使用できます。

ワークシートデータの場合

string strBk$ = Book1;
string strSh$ = Sheet1;
range rDa = [strBk$]strSh$!col(A);  // これはデータ範囲
range rSh = [strBk$]strSh$!;        // これはシート範囲
rDa = {1:30}; // 1から30まで、増分1のデータを生成
// シート範囲/オブジェクトのプロパティを使用
if(rSh.ncols < 10) 
   // 列の追加は次のように簡単に実行できる
   rSh.nCols = 10; 
loop(ii,2,10)
{
// プログラムで範囲を再代入
range rDb = [strBk$]strSh$!wcol(ii); 
    rDb = normal(30);
    rDb += rDa;
}

プロットされた(グラフ)データの場合

プロットされたデータからも様々な範囲を得ることができます。

// アクティブレイヤの3番目のデータプロットの範囲( [Book]Sheet!col ) を取得
range -w rngData = 3; 
rngData = rngData+10; //各要素に10を追加

行列データの場合

同様に、Range変数とmatrix要素で行列オブジェクトにアクセスするには、[rowNumber, colNumber]を使用します。

newbook mat:=1; //行列ワークブックを作成
wks.ncols=5; //列数を5に設定
wks.nrows=4; //行数を4に設定
range mymat=1; //範囲変数mymatは第1行列オブジェクトを参照
mymat=data(1,20); //mymatに1から20までの値を代入

行列は二次元配列(MxNの表)のように見えますが、実際は行メジャー配列を使った一次元配列です。行列の値にアクセスするには:

MatrixObject[N*(i - 1) + j]

ここで、Nは行列の列の数、iおよびjは行と列の数です。よって、4行×5列の行列に対して、[2,3]と[8]を使うと、同じセルが参照されます。例:上記のコードの後、次を実行します。

if(mymat[2, 3] == mymat[8]) 
	type "They are the same!";

Col(), Mat(), WCol() 関数による

Col()およびWCol( )を使用してワークブックの列にアクセスする

// Sheet2を含むBook5という名前のワークブックがあることを確認
// ここで win -o コマンドを使用して一時的にワークブックを切り替え、次のように設定
string strBk$ = Book5;
string strSh$ = Sheet2;
win -o strBk$
{
   temp = page.active;       // アクティブシートを記録
   page.active$ = strSh$;
   // col( ) 関数によって列名(1..n)を取得
   col(1) = {1:30};          
   loop(ii,2,10)
   {
      // wcol( ) 関数によって列番号または整数値を取得
      wcol(ii) = normal(30); 
      // col( ) 関数はショートネームを取得可能
      wcol(ii) += col(A);    
   }
   page.active = temp;     // 元のアクティブシートに戻す
}                          
// 'win -o'を終了して元のアクティブウィンドウに戻る

通常のワークブックと同様に、行列ワークブックには複数の行列シートが存在する場合があります。そして各行列シートには、通常のシートの列に類似した複数の行列オブジェクトが存在する可能性があります。 したがって、Mat()はCol( )と似た形で使うことができます。

newbook mat:=1; //新規ワークブックを作成。デフォルトは32x32の行列
mat(1)=normal(32*32); //1番目の行列オブジェクトに正規化したランダム値を代入
wks.nmats=2; //行列オブジェクトの数を2に設定
matrix -it 1; //行列シート内の全ての行列オブジェクトを確認するため、サムネイル画像を表示
wks.active=2; //2番目の行列オブジェクトをアクティブ化
mat(2)=data(0.01, 10.24, 0.01); //2番目の行列オブジェクトに0.01から10.24までの値を増分0.01で代入

Cell関数

Cell()関数は、ワークシートまたは行列のいずれかで使用できます。アクティブでないブックを参照する場合、プレフィックスbookshortname!を使用して、指定されたブック内のアクティブシートのみを参照できます。

cell(5,2) = 50; // アクティブウィンドウの行5, 列2のセル
                //(ワークシートまたは行列)の値を50に設定
// 異なるワークブック/行列ウィンドウに対してはプレフィクスを使用できる。
// しかしターゲットはその中のアクティブシートになることに注意

// アクティブシートの行10、列1のセルの値を100に設定
Book5!cell(10,1) = 100; 
// 関数は変数を許可
for(ii = 1 ; ii <= 32 ; ii++)
{
    for(jj = 1 ; jj <= 32 ; jj++)
    {
        MBook1!cell(ii,jj) = (ii-1) * 32 + jj;
    }
}

%() 置換表記

ワークシート列とセルの置換を使用して、ワークシートのデータセットにアクセスします。

//ワークブックの列にアクセス
%(%H, A)=data(1,30); //アクティブウィンドウのアクティブシートの列A
%([%H]Sheet2, A)=data(50,70, 0.5); //アクティブウィンドウのsheet2の列A

//ワークブックのセルにアクセス
%(%H,2,1) = 1;       // アクティブウィンドウのアクティブシートの列2、行1
%([Book2]Sheet3,2,1) = 100; //book2, sheet3, 列2、行1
%([Book2],2,1) = 10; // 古いバージョンではコマンドエラーが発生する場合がある
%(Book2,2,1) = 10;   // Book2, アクティブシート、列2、行1

// 置換は実行前に機能するため、次のようなことが可能になる
%([Book2]Sheet1,2,1) + %([Book2]Sheet2,2,1) + %([Book2]Sheet3,2,1)=;
val = %([Book2]Sheet1,2,1) + %([Book2]Sheet2,2,2) + %([Book2]Sheet3,2,3);
type "Cross-sheet sum \x3D $(val)";

データセット名による

これはLabTalkの最も古い表記であり、古いLabTalkコードを維持する必要がある場合、またはワークブックに1つのシートしかないことがわかっている場合、またはルーズデータセットで作業している場合を除き、使用しないでください。

// データセット名
// データセットの正式名称を使用:
// PageName_ColumnName[@SheetIndex]
// ここで PageName および ColumnName はショートネームを表す
//SheetIndexは作成順のインデックス
// (SheetIndexはウィンドウ内のタブとして並んでいる順番ではないことに注意)
Book1_B = Uniform(100);   //データセットを埋める
Book1_B@2 = Data(1,365);  // 同じブック名、列名だが、
                          // 2番目のシートを指す
July_Week1@3[5]$ = Sell;  // 特定の行要素にアクセス
                          // ('July'という名前のブックのsheetindex 3の
                          // 'Week1'列の5行目)
BSmith = 6;
ChemLab_Grade@3[BSmith] = 86; 
     // 行へのアクセスに編素を使用可
     //('ChemLab'の3番目のシートのGrade'列の6行目)

データセットストレージへのアクセス

Origin 2018b以降、LabTalkはデータセットストレージにアクセスできます。現時点では実用性は限られていますが、今後のバージョンで拡張される予定です。

データセット名の前に次のプレフィクスを付けます。

dataset.

例:

dataset.Book1_B.info.=; // データセットのinfo.エリアにある情報を返す
dataset.Book1_B.info.Add(Something); // データセットにストレージオブジェクト"Something"を追加
dataset.Book1_B.info.Remove(Something); //データセットからストレージオブジェクト"Something"を削除

セルのマスキング

ワークシートの列および行列シートのセルは、次のようにマスクできます。

dataset<index> = 1

例:

// 列Aのセル3をマスク
col(a)<3> = 1;
// 行列内のセルをマスク
range rr = [mbook1]msheet1!mat(1);
rr<2> = 1;

// セルのマスク解除
col(a)<3> = 0;

行列の場合、 <row, col>を使用してセルを指定することもできます。

// 現在の行列シートの行2、列3セルをマスク
%C<2,3> = 1;
// 現在の行列シートの2行目全体をマスク
%C<2,0> = 1;
// 現在の行列シートの3列目全体をマスク
%C<0,3> = 1;

指定した範囲をマスクするには、markコマンドを参照してください。

データセットに対する列値の設定

必要なOriginのバージョン: 9.0 SR0以降

あるサイズのデータセットを数式と実行前の処理スクリプトで生成し、後でそのデータセットを特定の列に割り当てることができます。構文は次の通りです:

dataset.setvalues("Formula", "Before formula script", "From", "To")

Formulaでは、列値の設定ダイアログのF(x)メニューのような関数を呼び出すことができます。

次に例を示します:

newbook;
wks.addcol();
dataset ds1,ds2,ds3;//3つのデータセットオブジェクトを定義
//各オブジェクトの値を設定
ds1.setvalues("i+grnd()","","1","20");
ds2.setvalues("sin(i)","","1","20");
ds3.setvalues("col(1)*col(2)","col(1)=ds1;col(2)=ds2;","1","20");
//列3の値としてds3データセットを使用
col(3)=ds3;

データセットのsetvalues メソッドは、再計算オプションをサポートしていないことに注意してください。これについてはcsetvalue Xファンクションを参照してください。

Xファンクションでルーズデータセットを使用

ルーズデータセットはワークシートの列のオーバーヘッドを持たないため、LabTalkスクリプトで使用する方が効率的です。スコープ内で使用すると、スコープが終了したときに自動的にクリーンアップされます。 たとえば、ルーズデータセットのmissingvalsを宣言し、vfind Xファンクションを使用して(アクティブなワークシートの)列1に欠損値の行番号を代入します。

// ルーズデータセットを宣言
dataset  missingvals;
// 行番号の検索のためにvFind Xファンクションを呼び出す
// ここでは列1に欠損値がある
vfind ix:=1 value:=NANUM ox:=missingvals;
// 結果のmissingvalsにアクセス
for(int ii=1; ii<=missingvals.GetSize(); ii++)
   type $(missingvals[ii]);

多くのXファンクションはツリー形式で出力を生成し、ツリーノードのいくつかはベクトルになることがあります。このようなベクトルにアクセスするには、データセットにコピーする必要があります。 ツリーベクトルを直接列に入れることもできますが、その後の計算でベクトルを使用する場合は、ルーズデータセットを使用する方が効率的です。