如何使用JSL對矩陣分支中間的數據進行分類和匯總,並以矩陣形式獲得匯總結果?如何使用JSL對矩陣分支中間的數據進行分類和匯總,並以矩陣形式獲得匯總結果?

謝謝專家!
dt=Open("$SAMPLE_DATA/Big Class.jmp");
ar=dt<<GETASMATRIX></GETASMATRIX>
腳本編寫回复:如何使用JSL對矩陣分支中間的數據進行分類和匯總,並以矩陣形式獲得匯總結果?我不確定這是獲得最終結果的最佳方法,但是如果您只想使用矩陣就可以:
NamesDefaultToHere(1);
// Sample data
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Matrix with all 'height' and 'weight' values
ar = dt << GetAsMatrix({4,5});
// Discard rows
ar = ar[6::35, 0];
// Find out the distinct levels of 'height'
hl = Matrix(AssociativeArray(ar[0,1]) << getKeys);
// Build the average 'weight' for each level into a new matrix 'rm'
rm = J(NRow(hl), 2, .);
for(h=1, h<=NRow(hl), h++,
rm[h, 1] = hl[h];
rm[h, 2] = VMean(ar[Loc(ar[0, 1] == hl[h]), 2]);
);
Print(rm);回复:如何使用JSL對矩陣分支中間的數據進行分類和匯總,並以矩陣形式獲得匯總結果?謝謝ian! 這就是這個循環的工作方式。
ar=dt<<GETASMATRIX></GETASMATRIX>
回复:如何使用JSL對矩陣分支中間的數據進行分類和匯總,並以矩陣形式獲得匯總結果?這是一種避免循環的方法,儘管它創建了不可見的表。 如果性能足以滿足您的需求,則此方法易於使用和理解。
乾杯,
布雷迪
dt = open("$Sample_Data/Big Class.jmp");
dtSub = dt << subset(rows(6::35), invisible);
dtsum = dtsub << summary(group(:height), mean(weight), invisible);
mat = dtSum << get as Matrix;
close(dtSum, nosave);
close(dtSub, nosave);
show(mat);Re: 如何使用JSL對矩陣分支中間的數據進行分類匯總,並以矩陣的形式得到匯總結果?編輯:
我注意到下面代碼的原始版本中有一個錯字,我已經更正了。 在最後一行,錯字是:
nrow (s)
相反,請使用:
行(小時)
當然, nrow (n) 或 nrow(m) 也可以使用,因為每個向量 h、n 和 m 都具有相同的行數。
對於那個很抱歉。
乾杯,
布雷迪
/////////////////////////////原帖:
在研究基於表的方法的性能時,它比基於矩陣的方法慢得多,這可能會抵消其簡單性,具體取決於您的表。
這是另一種基於矩陣的方法;雖然它的性能與 Ian 發布的類似,但我將其包含在內有幾個原因:a) 引入“選定”列的概念,如果選擇了一行,則標記為 1,否則標記為 0,b) 以顯示“hack” " 和 c) 的匯總函數,因為這避免了循環和與之相關的潛在索引陷阱。
第一:“選定”列。 在下面代碼的第一行中,我們向表中添加了一個新列,該列在選定行中將自身設置為 1,在其他地方設置為 0。 這允許我們創建一個額外的分組列,目的是使用基於表的平台和功能,如匯總和匯總,而無需創建新表。
接下來,Summarize() hack:注意我們按 :selected 和 :height 分組。 雖然 h、n 和 m 值在矩陣中返回,但 by 變量值放置在字符串列表中...即使它們可以放置在矩陣中。 所以在這種情況下, b 是兩個字符串列表的列表。 因此,如果我們想要矩陣形式的這些值中的任何一個,我們可以將所需的字符串列表轉換為矩陣(如果列表很大,這很昂貴)或者我們可以計算“便宜”的統計數據,如 Min 或 Max,在同一列上,獲取這些值......這就是我們在下面對高度列所做的。
乾杯,
布雷迪
dt << New Column( "Selected", formula( Selected( Row State() ) ) );
dt << Select Rows( 6 :: 35 );
Summarize( dt, b = by( :Selected, :height ), h = max( :height), n = Count( :weight ), m = Mean( :weight ) );
sumMat = (h || n || m)[contains(b[1], "1"):: nrow(h),0]; //only use the results where selected == 1