So come farlo in SAS ma non riesco a capirlo in JMP!!! Come dati fittizi allegati, ho un ID univoco per ogni riga e diverse variabili che sono 1 o 0. Voglio riassumere per ogni ID ciò che la variabile è stata contrassegnata come 1, E l'elenco deve basarsi sull'ordine delle frequenze di ciascuna variabile (chi ha più 1 fino a meno 1). È facile riordinare manualmente le colonne e poi concatenare tutto nella colonna dei risultati, ma ho migliaia di righe e centinaia di colonne da riordinare. Devo trovare un modo piuttosto che manuale... morire qui. per favore aiuto!
Questo post dovrebbe essere molto probabilmente nell'area Discussioni e non nell'area Discussioni della community.
Molto probabilmente ci sono modi migliori per farlo, ma ecco una soluzione di scripting pesante 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:
Impila 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 le 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 dello script