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