在矩陣上使用If Then<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />嗨伙計,
由於重新調整儀器,我有一些儀器數據會定期顯示數據的大變化。 我正在嘗試創建一個執行以下操作的新變量:If(data - 數據[i-1]> 4)或(數據 - data [i-1] < - 4),然後是adj_data = adj_data [i-1],Else,data = 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,344569600,3488656000,3448742400,3448828800,
3448915200,3449001600,3449088000,3449174400,3449260800,
3449347200,3449433600,3449520000,3449606400]
)
)
新欄目(“Data1”,
數字,
連續,
格式(“最佳”,12),
設定值(
[11,13,50,15,。,17,18,-20,20,。,21,22,。,24,25,23,。,。,。
。,。,25,26,27,28]
)
)
新欄目(“Adj Data1”,
數字,
連續,
格式(“最佳”,12),
設定值(
[0,2,。,4,。,6,7,。,9,。,10,11,。,13,14,12,。,。,。,。,14,
15,16,17]
)
)
);
//將相關數據放入矩陣中
date_time =:名稱(“日期”)<<獲取值;
data =:Name(“Data1”)<<獲取值;
//確定僅包含未丟失數據的行
row_list = dt <<獲取行所在的位置(
和(
!缺少(:Data1),
包含(data,:Data1),
包含(data,:Data1)== Contains(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))];
Re:在矩陣上使用If Then對不起傑夫我不太清楚我想要完成什麼。 通過討論JSL代碼和列公式,我可能會感到困惑。
附加的數據文件顯示:adj_data1中的“所需”輸出和新調整數據中提供的列公式的輸出。 請注意,新調整數據列在以下情況下插入先前的新調整數據值:數據1丟失,即使目標是在以下情況下讓新調整數據顯示缺少數據:data1丟失。
為了創建:adj_data1列,我試圖調整您的列公式,以便:
- 當:data1丟失時,先前的新調整數據值被放入局部變量並繼續運行,直到在步驟2中需要
- 如果當前:data1值未丟失且上一個:缺少data1值,則將新調整數據設置為局部變量中的當前值列表。
在我掛起的地方是將第1步中的New Adj Data值添加到局部變量,然後在步驟2中檢索/使用該值。
也許我讓它變得比它需要的更複雜,你有一個簡單的方法來實現這一點。 我當然感謝您提供的任何幫助。 如果你的解決方案沒有在列公式中使用局部變量,如果你能提供一個如上所述使用局部變量的簡單示例,或者指向現有的JMP數據集,我也將不勝感激。在列公式中使用局部變量。 看起來能夠在列公式中成功使用局部變量會非常有幫助。 再次感謝。
Re:在矩陣上使用If Then您對如何使用列公式中的局部變量完成以下JSL代碼有任何指導嗎?
如果要在JSL程序中定義變量,並希望在列公式中使用它們,則它們必須是全局變量。 使用“::”作為變量的前綴,您可以在列公式中使用它們。 例如 :: g_one_variable
Re:在矩陣上使用If Then嗨Terapin,
我擔心根據您發送的JSL,我很難解讀您想要做的事情。
我上面附加的數據表處理data1中缺少的值,而不需要公式中的局部變量。它檢查當前行或前一行中是否缺少Data1,而是缺少(:Data1 - Lag(:Data1,1))。如果其中任何一個缺失,那麼差異也將丟失。
這是New Adj Data列中的公式:
如果(
Row()== 1,0,
Abs(:Data1 - Lag(:Data1,1))> 4 |丟失(:數據1 - 滯後(:數據1,1)),滯後(:新調整數據,1),
滯後(:新調整數據,1)+(:數據1 - 滯後(:數據1,1))
)
如果這不是您所需要的,您可以發布一個樣本數據表,並準確說明您希望每個行中基於這個新公式的列的值是什麼?這將幫助我準確理解你在尋找什麼。
謝謝!
-Jeff
Re:在矩陣上使用If Then感謝Jeff提供列公式的示例以及矩陣示例。正如您可能想像的那樣,我的情況稍微複雜一些,需要我跳過數據丟失的行,但是繼續前面調整的數據值。 我可以使用以下JSL代碼完成此操作,但無法弄清楚如何在列公式中使用局部變量。 您對如何使用列公式中的局部變量完成以下JSL代碼有任何指導嗎?謝謝。
清除日誌();
lag_adj_data = 0;
:adj_data1 [1] = 0;
對於(i = 2,i <= N行(dt1),i ++,
如果(Abs(:data1 - :data1 [i - 1])> 4,
:adj_data1 =:adj_data1 [i - 1],
:adj_data1 =:adj_data1 [i - 1] +(:data1 - :data1 [i - 1])
);
如果(缺失(:data1 )&!缺少(:adj_data1 [i-1]),
lag_adj_data =:adj_data1 [i-1];
);
如果(缺少(:data1 [i-1])&!缺失(:data1 ),
:adj_data1 = lag_adj_data
);
);
Re:在矩陣上使用If Then正如我昨天所提到的,一般來說,列公式非常有效。
請參見附件數據表。新調整數據列的公式接近您要查找的內容。
這仍然是一個小數據集,但它仍然可以很好地用於許多行。
-Jeff
Re:在矩陣上使用If Then矩陣像常規變量一樣工作 - 更準確地稱為標量 - 與大多數算術和比較運算符。
例如:
X = [ 1 , 2 , 3 , 4 ] ;
ÿ = [ 2 , 1 , 2 ,五 ] ;
X > ÿ ;
/ *:
[0,1,1,0]
如您所見,我現在有一個矩陣,指示y矩陣大於x矩陣的位置。
但是,您不僅限於將一個矩陣與另一個矩陣進行比較。您也可以與標量進行比較。
X > 2 ;
/ *:
[0,0,1,1]
我也可以一次對整個矩陣進行算術運算。
X - 4 ;
/ *:
[-3,-2,-1,0]
您可以索引矩陣以僅獲取矩陣的一部分,以便您可以輕鬆地將矩陣的一部分與另一部分進行比較。
ÿ [ 2 :: nrow ( ÿ )] > ÿ [ 1 :: nrow ( ÿ ) - 1 ] ;
/ *:
[0,1,1]
您還可以在矩陣上使用函數。
ž = [ 1 ,五 , 1 - 6 ] ;
ABS ( ž [ 2 :: nrow ( ž )] - X [ 1 :: nrow ( ž ) - 1 ]) > 4 ;
/ *:
[0,0,1]
結合所有這些,你應該能夠用矩陣做你正在尋找的東西。
但是,數據表中的列公式會更直接,也可能同樣有效。我明天將跟進一個例子。
-Jeff
Re:在矩陣上使用If Then感謝PMroz的建議。 這肯定會對錶中的數據起作用,但是該表有大約500,000條記錄,我認為在矩陣中進行調整比直接處理數據表要快。 您對在矩陣上使用條件命令的語法有什麼建議嗎?我查看了各種JMP“書籍”,但沒有找到任何明確指定語法的內容。 謝謝。
Re:在矩陣上使用If Then我想這會做你想要的。 我直接在你的桌子上操作,順便說一句。
DT = 數據表 ( “調整缺失的數據” ) ;
對於 ( 一世 = 2 ,一世 <= NROWS ( DT ) ,一世 ++,
迪 = 柱 ( DT , “數據1” ) 一世 ] ;
DIM1 = 柱 ( DT , “數據1” ) 一世 - 1 ] ;
ADJI = 柱 ( DT , “Adj Data1” ) 一世 ] ;
如果 ( !不見了 ( 迪 ) & !不見了 ( DIM1 ) ,
如果 ( ABS ( 迪 - DIM1 ) > 4 ,
// 然後
柱 ( DT , “Adj Data1” ) 一世 ] = 柱 ( DT , “Adj Data1” ) 一世 - 1 ] ;
,
//別的
如果 ( !不見了 ( ADJI ) ,
柱 ( DT , “數據1” ) 一世 ] = ADJI + ( 迪 - DIM1 ) ;
) ;
) ;
) ;
) ;