改造挑戰建議:有關循環或在列表/矩陣/...中尋找元素/值的內容回覆:改造挑戰建議:有關循環或在清單/矩陣/...中尋找元素/值的內容你好@jthi ,
我已經嘗試過你的第一個建議 - 它按預期工作。 多謝。 最後一行幾乎就是我一直在尋找的一句台詞!
回覆:改造挑戰建議:有關循環或在清單/矩陣/...中尋找元素/值的內容與喬治的想法類似。 每次選擇新列時,請再次執行 EvalEvalExpr()) 部分(如果需要,可以將其製作為腳本/外掛程式/捷徑)。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
//create placeholder for colum
new_col = dt << New Column("Sum_selected", Numeric, Continuous);
//after column selection run this part to update script
Eval(EValExpr(new_col << Set Formula(Sum(Expr(Current Data Table() << Get Selected Columns)))));JMP 沒有(據我所知)“列狀態處理程序”,因此您無法像處理行那樣在列選擇更改後觸發事件。
您也可以嘗試類似的操作,但我建議反對它,並將公式更新移動到按鈕按下而不是過濾器列框選擇更改,因為這樣更容易管理
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
nw = New Window("Update formula",
window:new_col = dt << New Column("Sum_selected", Numeric, Continuous); //create column inside new window
window:dt = dt;
flc = Filter Col Selector(
dt, << character(0), << nominal(0), << ordinal(0),
<< On Change(
show(window:new_col, window:dt);
window:dt << Select columns((flc << Get Selected));
Eval(EValExpr(window:new_col<< Set Formula(Sum(Expr(window:dt << Get Selected Columns)))));
)
)
);回覆:改造挑戰建議:有關循環或在清單/矩陣/...中尋找元素/值的內容親愛的@單態論者,
也許這有幫助。 當使用大量列時,我發現使用列組是有利的。 下面的範例定義了一個群組(可以在腳本索引中找到許多範例),並為該列建立平均公式並實現它。
如果需要,同樣可以為選定的列編寫腳本。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Blood Pressure.jmp" );
Wait( 1 );
theGroup = dt << Group Columns( "theGroup", :BP 8M :: :BP 12W );
Wait( 1 );
// build an expression for formula with column replacement
formula_expr = expr(dt << New Column( "Mean_of_Group",
Numeric,
"Continuous",
Format( "Best", 10 ),
Formula( mean( expr(current data table() <<GET column="" group=""></GET>
回覆:改造挑戰建議:有關循環或在清單/矩陣/...中尋找元素/值的內容嗨,DS,
好吧,這就是我到目前為止的做法:循環遍歷行,然後為每一行循環遍歷列。 不過,我希望有一個更優雅的解決方案。 簡單的一句台詞......
這是一個具體且非常簡單的範例:
我有 50 列,我想計算每一行我選擇的列的算術平均值。 假設我選擇 3 列 E1、E6 和 E12 來計算平均值。 當我手動執行此操作時,需要花費幾秒鐘的時間:在資料表中新增一列,選擇 3 列並除以 3 -> (:E1 + :E6 + :E12) / 3。
如果我想在腳本中執行此操作,並且希望在我選擇的不是 3 列而是 4 或 5 或 20 列的情況下保持腳本有效,我還沒有找到任何其他方法 - 無論是在社區還是在JMP 庫/腳本指南等- 而不是垂直循環遍歷每一行,然後嵌套水平循環遍歷列。 這似乎很笨拙? 另一個選擇是編寫49 個不同的宏,每個宏對應所選列的確切數量,也就是說,如果我想選擇7 列,我運行script7,如果我想選擇21 列,我運行script21,使用以下公式調整為21項。 我覺得這相當可笑(那麼我最好保留我笨重的嵌套循環......)
是否沒有 JSL 語法將公式壓縮為簡單的一行程式碼,例如:
dt << 新欄位(「AnyTitle」、數字、連續、公式(Sum_of_all_selected_columns / N_items))?
當可以從 ColDialog ColList 中檢索所選列時,表達式/列公式“Sum_of_all_selected_columns”在 JSL 中看起來如何(如果存在?!?),它可能是 :: 位 -> Sum(v1::vn) ,其中v1 是ColList 中的第一項,vn 是最後一項,公式對第一項、最後一項以及中間的所有項進行求和,而不需要指定中間有多少項?
我經常遇到這個問題,我希望腳本用先驗未知數量的項目來計算某些內容(例如總和或乘積等)。
乾杯,
科菲
回覆:改造挑戰建議:有關循環或在清單/矩陣/...中尋找元素/值的內容你好@單態論者,
這是我透過搜尋討論論壇找到的一些修改後的程式碼。 原帖是這裡。
我認為如果您有一個結果列列表(應該很容易生成或獲取),那麼您應該能夠實現類似我修改過的 AddCols 之類的功能來產生您需要的公式。 原來的貼文內容非常豐富有趣。
Names Default To Here( 1 );
// Make a table
nc = 30;
dt = New Table( "Test" );
For( c = 1, c <= nc, c++,
dt << New Column( "Col" || Char( c ), Numeric, Continuous, Formula( Random Normal() ) )
);
dt << AddRows( 100 );
// Select half the columns
n = Round( nc / 2 );
c = Random Index( N Col( dt ), n );
For( i = 1, i <= n, i++,
Column( dt, c[i] ) << setSelected( 1 )
);
//This part generates the column formulas based on the SelCols list.
SelCols = dt << Get Selected Columns;
For( j = N Items(SelCols), j >= 1, j--,
AddCols = Expr(
dt << New Column( "Sum_" || Char( j ), Formula( Sum( colsTBD ) ) )
);
Substitute Into( AddCols, Expr( colsTBD ), Eval( selCols[1::j] ) );
AddCols;
);
希望這可以幫助!,
DS
回覆:改造挑戰建議:有關循環或在清單/矩陣/...中尋找元素/值的內容我的腳本中有 80% 涉及循環,遍歷通常包含 +100k 行和 +50 列的資料集。 根據我設定的條件,腳本可能會提取 2、3、5、10 或 20 個這些列進行各種計算(例如對數比率對),然後將其結果儲存在附加的「結果」中「列,可能是10、20 或100 列(然後我需要比較相似性......)。 如果我現在想處理結果列,但不知道最終會得到多少列......我該如何編寫公式,以便它們始終有效,無論是 2 還是 200要應用的列?
我可以將每個結果欄位轉儲到一個清單中,因此我知道我有多少個結果欄位。 但我仍然不知道如何制定方程式(例如 x = n1 + n2 對於 2 列,但 n1 + n2 + .... + nn 對於 n 列)。
乾杯,
科菲