マトリックス上でIf Ifを使う<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />こんにちは、
機器を再調整したために定期的にデータに大きな変化が見られる機器データがあります。 私は次のことを行う新しい変数を作成しようとしています。 - データ[i-1]> 4)または(データ) - data [i-1] <-4)、その後adj_data = adj_data [i-1]、その他、データ = adj_data +(データ - データ[i-1])基本的に、現在のデータ値が前の値を4または-4だけ超えた場合は、新しい調整値を前の調整値に等しくします。それ以外の場合は、現在のデータ値と前のデータ値の差を調整値に加えます。
データをマトリックスに読み込んで欠けているデータを削除する方法を考え出しましたが、マトリックスについて上記で概説した数学を完成させる方法はわかりません。 これを達成する方法についての任意の提案は高く評価されるでしょう。
ログを消去();
デフォルトはここにあります(1)。
dt =新しいテーブル( "欠損データを調整する"、
行を追加する(24)
保存時にファイルを圧縮(1)
新しい列( "日付"、
数値、
連続した、
フォーマット( "m / d / y"、19)、
入力フォーマット( "m / d / y")
値を設定(
[3447619200、3447705600、3447792000、3447878400、3447964800、
3448051200、3448137600、3448224000、3448310400、3448396800、
3448483200、3448569600、3448656000、3448742400、3448828800、
3448915200、3449001600、3449088000、3449174400、3449260800、
3449347200、3449433600、3449520000、3449606400]
)
)
新しい列( "データ1"、
数値、
連続した、
フォーマット( "最高"、12)、
値を設定(
[11、13、50、15、...17、18、−20、20、..21、22 、.、24、25、23 、.
、、25,26,27,28]
)
)
新しい列( "調整データ1"、
数値、
連続した、
フォーマット( "最高"、12)、
値を設定(
[0、2、。、4、。、6、7、...、9、。、10、11、。、13、14、12、...、...、14、
15、16、17]
)
)
;
//関連データを行列に入れる
date_time =:Name( "Date")<<値を取得します。
data =:Name( "Data1")<<値を取得します。
//欠けていないデータのみを含む行を決定します
row_list = dt <<ここで行を取得(
そして(
!(:Data1)がありません。
(data、:Data1)を含みます。
(data、:Data1)を含む==(date_time、Format(:Date、"mdy"))を含む
)
;
//現在行列[]であるrow_listをリスト{}に変換する
List(row_list = As List(row_list))です。
date_time = date_time [Loc(!Is Missing(data))];
data = data [Loc(!Is Missing(data))];
再:マトリックス上であれば使用申し訳ありませんがジェフ私は私が達成しようとしていることについてはっきりしませんでした。 私はJSLコードと列式の両方について話すことによって物事を混乱させたかもしれません。
添付のデータファイルには、adj_data1内の「目的の」出力と、New Adj Dataで指定した列式からの出力が表示されます。 :data1が欠落している場合に目標値がNew Adj Dataに欠損データが表示されるようにすることが目的であっても、New adj Data列には前のNew Adj Data値が挿入されます。
:adj_data1列を作成するために、列式を次のように調整しようとしました。
- data1がない場合は、前のNew Adj Data値がローカル変数に配置され、手順2で必要になるまで繰り越されます。
- 現在の:data1の値が欠落していない&前の:data1の値が欠落している場合、New Adj Dataはローカル変数の現在の値リストに設定されます。
ハングアップしたのは、ステップ1のNew Adj Data値をローカル変数に追加してから、ステップ2でその値を取得/使用することです。
たぶん私はそれを必要以上に複雑にしています、そしてあなたはこれを達成する簡単な方法を持っています。 私は確かにあなたが提供することができるどんな助けにでも感謝するでしょう。 もしあなたの解決法が列式でローカル変数を使わないのなら、上で説明したようなローカル変数の使い方の簡単な例を提供するか、既存のJMPデータセットを私に指摘してください。列式でローカル変数を使用します。 列式でローカル変数を正しく使用できれば非常に役に立つようです。 再度、感謝します。
再:マトリックス上であれば使用列式にローカル変数を使用して次のJSLコードを実行する方法について何かアドバイスはありますか。
JSLプログラムで変数を定義していて、それらを列式で使用したい場合、それらはグローバル変数である必要があります。 変数の先頭に "::"を付けると、列式でそれらを使用できます。 例えば :: g_one_variable
再:マトリックス上であれば使用こんにちはテラピン、
あなたが送ったJSLに基づいてあなたが何をしたいのかを解読するのに苦労しています。
上記で添付したデータテーブルは、式にローカル変数を必要とせずにdata1の欠損値を扱います。!Is Missing(:Data1 - Lag(:Data1,1))を使用して、Data1が現在の行または前の行にないかどうかを確認します。どちらかが欠けていると、違いもなくなってしまいます。
これがNew Adj Data列の式です。
もし(
Row()== 1、0、
Abs(:Data1 - Lag(:Data1、1))> 4 | Missing(:Data1 - Lag(:Data1、1))、Lag(:New Adj Data、1)、
Lag(:New Adj Data、1)+(:Data1 - Lag(:Data1、1))
)
これが必要なものではない場合は、この新しい式ベースの列の値を各行にどのように配置したいのかを説明したサンプルデータテーブルを投稿できますか。それは私があなたが探しているものを正確に理解するのを助けるでしょう。
ありがとうございます。
- ジェフ
再:マトリックス上であれば使用列式の例とマトリックスの例を提供してくれてありがとうJeff。ご想像のとおり、私の場合はもう少し複雑で、データが欠落している行をスキップして前の調整済みデータ値を繰り越す必要があります。 次のJSLコードでこれを達成できますが、列式でローカル変数を使用する方法を理解することはできません。 列式にローカル変数を使用して次のJSLコードを実行する方法について何かアドバイスはありますか。ありがとう。
ログを消去();
lag_adj_data = 0;
:adj_data1 [1] = 0。
(i = 2、i <= N行(dt1)、i ++、
If(Abs(:data1 - :data1 [i - 1])> 4
:adj_data1 =:adj_data1 [i - 1]、
:adj_data1 =:adj_data1 [i - 1] +(:data1 - :data1 [i - 1])
;
If(がない(:data1 )&!がありません(:adj_data1 [i-1])、
lag_adj_data =:adj_data1 [i-1];
;
(Missing(:data1 [i-1])&!Is Missing(:data1がない場合) )
:adj_data1 = lag_adj_data
;
;
再:マトリックス上であれば使用昨日触れたように、列式は一般的に非常に効率的です。
添付のデータ表をご覧ください。列New Adj Dataには、探しているものに近い式があります。
これはまだ小さいデータセットですが、それでも多くの行でうまく機能するはずです。
- ジェフ
再:マトリックス上であれば使用行列は通常の変数のように機能します - より正確に呼ばれるスカラ - ほとんどの算術演算子と比較演算子で。
例えば:
バツ = [ 1 、 2 、 3 、 4 ] ;
よ = [ 2 、 1 、 2 、 5 ] ;
バツ > よ ;
/ *:
[0、1、1、0]
ご覧のとおり、yマトリックスがxマトリックスよりも大きい場所を示すマトリックスができました。
しかし、あなたは一つの行列を他の行列と比較することに限定されていません。スカラと比較することもできます。
バツ > 2 ;
/ *:
[0、0、1、1]
行列全体に対して算術演算を同時に実行することもできます。
バツ - 4 ;
/ *:
[-3、-2、-1、0]
行列にインデックスを付けて行列の一部だけを取得できるので、行列の一部を別の部分と簡単に比較できます。
よ [ 2 :: 眉 ( よ )] > よ [ 1 :: 眉 ( よ ) - 1 ] ;
/ *:
[0、1、1]
行列で関数を使うこともできます。
z = [ 1 、 5 、 1 、- 6 ] ;
腹筋 ( z [ 2 :: 眉 ( z )] - バツ [ 1 :: 眉 ( z ) - 1 ]) > 4 ;
/ *:
[0、0、1]
これらすべてを組み合わせることで、行列を使って探していることを実行できるはずです。
ただし、データテーブルの列式はより単純で、おそらく同じくらい効率的です。その例を使って明日フォローアップします。
- ジェフ
再:マトリックス上であれば使用提案をありがとうPMroz。 これはテーブル内のデータに対して確実に機能しますが、テーブルには約50万のレコードがあり、データテーブルを直接処理するよりもマトリックスで調整する方が早いと思います。 行列で条件付きコマンドを使用するための構文について何か提案はありますか?私はさまざまなJMPの「本」を調べましたが、構文を明確に示すものは何も見つかりませんでした。 ありがとう。
再:マトリックス上であれば使用私はこれがあなたが望むことをすると思います。 ところで、私はあなたのテーブルを直接操作しています。
dt = データ表 ( "欠損データを調整する" ) ;
にとって ( 私 = 2 、私 <= 眉 ( dt ) 、私 ++、
ジ = カラム ( dt 、 「データ1」 )[ 私 ] ;
dim1 = カラム ( dt 、 「データ1」 )[ 私 - 1 ] ;
隣接 = カラム ( dt 、 "調整データ1" )[ 私 ] ;
もし ( !不足している ( ジ ) & !不足している ( dim1 ) 、
もし ( 腹筋 ( ジ - dim1 ) > 4 、
//その後
カラム ( dt 、 "調整データ1" )[ 私 ] = カラム ( dt 、 "調整データ1" )[ 私 - 1 ] ;
、
//その他
もし ( !不足している ( 隣接 ) 、
カラム ( dt 、 「データ1」 )[ 私 ] = 隣接 + ( ジ - dim1 ) ;
) ;
) ;
) ;
) ;