So come farlo in SAS ma non riesco a capirlo in JMP!!! Come dati fittizi allegati, ho un ID univoco per ogni riga e variabili diverse che sono 1 o 0. Voglio riassumere per ogni ID ciò che la variabile ha contrassegnato come 1 E l'elenco deve basarsi sull'ordine delle frequenze di ciascuna variabile (chi ha il maggior numero di 1 fino al minimo 1). È facile riordinare manualmente le colonne, quindi concatenarle tutte alla colonna dei risultati, ma ho migliaia di righe e centinaia di colonne da riordinare. Devo trovare un modo piuttosto che un manuale... morire qui. per favore aiuto!
Questo post molto probabilmente dovrebbe essere in Discussioni non nell'area Discussioni della community.
Molto probabilmente ci sono modi migliori per farlo, ma ecco una soluzione pesante di scripting che sembrava funzionare con dati di esempio:
Names Default To Here(1);
//Example datatable
dt = New Table("Q OF THE DAY",
Add Rows(5),
New Column("ID", Character(1), "Nominal", Set Values({"A", "B", "C", "D", "E"}), Set Display Width(38)),
New Column("V1", Numeric, "Continuous", Format("Best", 12), Set Values([1, 0, 1, 0, 0]), Set Display Width(38)),
New Column("V2", Numeric, "Continuous", Format("Best", 12), Set Values([1, 1, 1, 0, 0]), Set Display Width(38)),
New Column("V3", Numeric, "Continuous", Format("Best", 12), Set Values([0, 0, 1, 0, 0]), Set Display Width(38)),
New Column("V4", Numeric, "Continuous", Format("Best", 12), Set Values([1, 1, 1, 0, 1]), Set Display Width(42)),
New Column("V6", Numeric, "Continuous", Format("Best", 12), Set Values([0, 0, 1, 0, 1]))
);
/*
colCount = 10;
dt = new table("example",
add rows(1000),
New Column("ID", Numeric, Ordinal, << Set Each Value(Row()));
);
For(i = 1, i <= colCount, i++,
dt << New Column("V" || char(i), Numeric, Ordinal,
<< Set Each Value(Random Binomial(1, 0.9))
);
);
*/
colNames = dt << Get Column Names("String");
//Drop ID column
colNames = Substr(colNames, 2);
//sorting list https://community.jmp.com/t5/JSL-Cookbook/Sorting-Lists/ta-p/240795
//create ranking based on sums and column idx
sumsOfCols = V Sum(dt[0, colNames]); //order is same as in coLNames
orderCols = Reverse(Rank(sumsOfCols));
newCol = dt << New Column("ORDERED", Character, Nominal);
For Each Row(dt,
//Indices of columns which have 1
idxWithOne = Loc(dt[Row(), colNames]);
//if all values are missing continue to next row
If(N Items(idxWithOne) == 0,
continue();
);
//fill list with empty values
tempList = Repeat({""}, N Items(colNames));
//replace empty with colnames which had 1
tempList[idxWithOne] = colNames[idxWithOne];
//reorder list based on sum ranking
reOrderedList = tempList[orderCols];
//create string of list and remove whitespaces
orderedString = Trim Whitespace(Collapse Whitespace(Concat Items(tempList[orderCols], " ")));
//add value to column
newCol[Row()] = orderedString;
);Inoltre non ha una gestione specifica per le cravatte.

Potresti anche farlo in modo interattivo:
Impilare i dati:

Aggiungi formule:
New Column("Orders",
Numeric,
"Continuous",
Format("Best", 12),
Formula(Col Sum(:Data, :Label))
),
New Column("RankForId",
Numeric,
"Continuous",
Format("Best", 12),
Formula(Col Rank(Col Max(:Orders) - :Orders, :ID)),
Set Display Width(70)
),
New Column("ColumnName",
Character,
"Nominal",
Formula(If(:Data == 1, :Label))
)Ordina i dati per ID e RankForId (seleziona entrambi e ordina in ordine crescente):

Trasporre i dati:


Rimuovi la colonna Etichetta e Combina colonne riga dal menu Colonne:

Rimuovere le colonne non necessarie e ricongiungersi al datatable originale, se necessario.
La soluzione interattiva potrebbe avere un ordinamento diverso tra i legami rispetto alla versione di scripting