我希望这个功能存在,如果没有的话将是一个很好的补充。 我正在寻找使用变量执行矩阵运算的能力。 据我所知,目前此功能仅存在于数据表中。 拥有此功能将能够在不使用循环的情况下对矩阵进行排序。
A = Random Index(10^4,10^2);
B = Shape(A,10,10);
C = Sort Descending(B); // Fails since function only supports vector or list
D = Rank(B);// Fails since function only supports vector or list
@gzmorgan0 ,
你的解释相当准确。 我同意 JMP 提供的观点一些按列功能。 我的要求是在平均值和总和之外扩展这些内容。
在实现这些函数时,如果可以避免的话,我不想使用循环。 如果内置函数已经使用它,通常它们会被优化,我对此表示同意。 但是,如果有可能避免使用循环,我会想避免它。
现在关于排名和排序,我见过的按行排序的另一种语言是在 Matlab 中( https://www.mathworks.com/help/matlab/ref/sort.html )。 我也一直在尝试学习 SAS,我所看到的一件事是在 SAS 中,为了获得排名,您对数据集进行排序并添加实际上有意义的行号。 因此,我在 JMP 中对行排序和排名的请求背后的意图是能够拥有这样的杠杆作用,用户可以对数据集进行排序,并使用 row() 函数自动获得排名顺序。
我一直在研究上述请求的用途的一个例子是对时间序列数据进行排名(每小时/每天/每周)。
目前,我知道如何在此类数据集上实现排名的唯一方法是将其带回数据表并使用 Col Rank() 和 Col Rank() 和 Col Number()。
A = Random Shuffle(Random Index(10^3,240)); // random hourly data for 10 days
dt = As Table(A);
As Column(dt,"Col1") << Set Name("TestVal");
dt << New Column("Day",Numeric,Continuous,Formula(Ceiling(Row()/24)))
<< New Column("RankHourByDayAsc",Numeric,Continuous,Formula(Col Rank(:TestVal,:Day)))
<< New Column("RankHourByDayDesc",Numeric,Continuous,Formula(Col Number(:TestVal,:Day) + 1 - Col Rank(:TestVal,:Day)));我假设您的“按变量”请求是按列。 JMP 已提供多种按列功能:V Mean、V Min 等。
我看到了 V Rank 的好处,但 V 降序排序会很奇怪。创建矩阵(使用 Shape 或 Get as Matrix 创建)后,通常,行中的项目会“链接”,即保持在一起。 您对降序排序(B)有何期望? 我并不了解所有语言,但我只在Matlab中见过按行排序,它使用行中的第一个元素来指定行顺序。 您是否有另一种语言或统计包中的示例可以排序但不维护行链接?
以下是 ByColMat() 函数的示例。 取消注释“用法”,然后进行测试。 注意降序排序会破坏行链接
Names Default to Here(1);
//=================================================================================
byColMat = Function({mat, expr_name}, {nc, imat, i, rslt},
//mat is a matrix, expr_name is a string of a valid vector function
//returns a matrix typically a row vector if the name_expr function returns 1 value
//or a matrix ofd the same size. Summary is a special case
nc = ncol(mat);
if(expr_name=="Summary",
imat=J(10,nc,empty());
imat[1,0] = V Mean(mat);
imat[2,0] = V Std(mat);
imat[3,0] = V Min(mat);
imat[4,0] = V Max(mat);
imat[5,0] = V Sum(mat);
For(i = 1, i<=nc, i++,
imat[6,i] = Quantile(.25, mat[0,i]);
imat[7,i] = Quantile(.50, mat[0,i]);
imat[8,i] = Quantile(.75, mat[0,i]);
imat[9,i] = imat[8,i] - imat[6,i];
imat[10,i] = nc - Nmissing(mat[0,i]);
);
Write("Stats are: Mean, Std Dev, Min, Max, Sum, Q25, Median, Q75, IQR, N");
, //else
imat=[];
mexpr = parse(expr_name || "(mat[0,i])");
For(i = 1, i<=nc, i++,
imat ||= eval(mexpr)
);
);//end if
imat
); //end function
/* Usage Example
//create a random matrix to emulate a data matrix
A = J(10,10, RandomInteger(1,10^4));
show(A, byColMat(A, "Summary"));
show(A, byColMat(A, "Sort Descending"));
show(A, byColMat(A, "Rank"));
*/