如何使用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