如何使用JSL對矩陣分支中間的數據進行分類匯總,並以矩陣的形式得到匯總結果?對於“Big Class.jmp”,“身高”和“體重”列被寫入矩陣中。
然後對矩陣第6行到第35行的數據進行分類匯總:匯總每個身高的平均體重。這個結果只需要存儲在內存矩陣中即可。

感謝專家!
dt=Open("$SAMPLE_DATA/Big Class.jmp");
ar=dt<<GETASMATRIX></GETASMATRIX>
高級統計建模內容組織數據探索和可視化分享和交流結果Re: 如何使用JSL對矩陣分支中間的數據進行分類匯總,並以矩陣的形式得到匯總結果?編輯:
我注意到下面代碼的原始版本中有一個拼寫錯誤,我已更正。 最後一行的錯字是:
n行
相反,使用:
行(h)
當然,nrow (n) 或 nrow(m) 也可以工作,因為每個向量 h、n 和 m 具有相同的行數。
對於那個很抱歉。
乾杯,
布雷迪
/////////////////////////////原帖:
在研究基於表的方法的性能時,它比基於矩陣的方法慢得多,這可能會抵消它的簡單性,具體取決於您的表。
這是另一種基於矩陣的方法;雖然它的性能與 Ian 發布的類似,但我將其包含在內有幾個原因:a)引入“選定”列的概念,如果選擇了一行,則該列標記為 1,否則標記為 0,b)顯示匯總函數的“黑客”行為,c)因為這可以避免循環以及與之相關的潛在索引陷阱。
第一:“選定”欄。 在下面代碼的第一行中,我們向表中添加一個新列,該列在選定的行中將自身設置為 1,在其他位置設置為 0。 這使我們能夠創建一個額外的分組列,目的是使用基於表的平台和功能(例如“Summary”和“Summarize”),而無需創建新表。
接下來,Summarize () hack:請注意,我們按 :selected 和 :height 進行分組。 雖然 h、n 和 m 值以矩陣形式返回,但變量值被放置在字符串列表中……即使它們可以被放置到矩陣中。 所以在這種情況下,b 是兩個字符串列表的列表。 因此,如果我們想要矩陣形式的任何這些值,我們可以將所需的字符串列表轉換為矩陣(如果列表很大,這會很昂貴),或者我們可以在同一列上計算“便宜”的統計數據,例如最小值或最大值,以獲得這些值...這就是我們下面對高度列所做的操作。
乾杯,
布雷迪
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
Re: 如何使用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對矩陣分支中間的數據進行分類匯總,並以矩陣的形式得到匯總結果?謝謝伊恩! 這就是這個循環的工作方式。
ar=dt<<GETASMATRIX></GETASMATRIX>
Re: 如何使用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);