J'espère que cette fonctionnalité existe, sinon ce serait un excellent ajout. Je recherche la possibilité d'effectuer des opérations matricielles en utilisant par variable. Actuellement, cette fonctionnalité n'existe que dans les tableaux de données, à ma connaissance. Avoir cette fonctionnalité permettra de trier les matrices sans utiliser de boucles.
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 ,
Votre interprétation est assez précise. Je suis d'accord avec vous que JMP fournit quelques fonctions par colonne. Ma demande était de développer ces sujets au-delà des moyens et de la somme.
En ce qui concerne votre implémentation de ces fonctions, je ne souhaite pas utiliser de boucles s'il est possible de l'éviter. Si une fonction intégrée l'utilise déjà, elle est généralement optimisée et je suis d'accord avec cela. Cependant, s’il existe une possibilité d’éviter d’utiliser une boucle, je voudrais l’éviter.
Maintenant, en ce qui concerne le classement et le tri, l'autre langage dans lequel j'ai vu le tri par ligne est Matlab ( https://www.mathworks.com/help/matlab/ref/sort.html ). J'ai également essayé d'apprendre SAS et l'une des choses que j'ai vues est dans SAS, pour obtenir un classement, vous triez l'ensemble de données et ajoutez un numéro de ligne qui a du sens. Ainsi, l'intention derrière ma demande de tri par ligne dans JMP à côté d'un classement est de pouvoir disposer de ce type d'effet de levier où un utilisateur peut simplement trier l'ensemble de données et obtenir automatiquement l'ordre de classement à l'aide de la fonction row().
Un exemple que j'ai examiné et où j'ai vu une utilisation pour la demande susmentionnée est le classement des données de séries chronologiques (horaires/quotidiens/hebdomadaires).
Actuellement, la seule façon dont je sais comment obtenir les classements sur un tel ensemble de données est de le ramener dans une table de données et d'utiliser Col Rank(), Col Rank() et 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)));Je suppose que votre demande "Par variable" concerne Par colonne. JMP propose déjà plusieurs fonctions par colonne : V Mean, V Min, etc.
Je vois un avantage du V Rank, mais le V Sort Descending serait étrange.Une fois que vous avez créé la matrice (créée avec Shape ou Get as Matrix), généralement les éléments d'une rangée sont "liés", c'est-à-dire conservés ensemble. Qu'attendez-vous du tri décroissant (B) ? Je ne connais pas toutes les langues, mais je n'ai vu qu'un tri par ligne dans Matlab, qui utilise le premier élément de la ligne pour spécifier l'ordre des lignes. Avez-vous un exemple dans une autre langue ou un autre logiciel statistique qui trie et ne maintient pas les liaisons de lignes ?
Voici un exemple de fonction ByColMat(). Décommentez « Utilisation » et testez-le. Remarque Le tri décroissant rompt la liaison des lignes
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"));
*/