我知道如何在 SAS 中做到这一点,但我无法在 JMP 中解决这个问题!!! 作为附加的虚拟数据,我对每一行都有唯一的 ID,不同的变量为 1 或 0。 我想为每个 ID 总结哪个变量标记为 1,并且列表必须基于每个变量的频率顺序(从 1 最多到 1 最少)。 手动重新排序列然后将所有列连接到我的结果列很容易,但我有数千行和数百列要重新排序。 我必须找到一种方法而不是手动……死在这里。请帮忙!
这篇文章很可能在讨论区而不是在社区讨论区。
很可能有更好的方法来做到这一点,但这里是脚本繁重的解决方案,它似乎适用于示例数据:
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;
);它也没有对关系的具体处理。

您可能还需要以交互方式执行此操作:
堆栈数据:

添加公式:
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))
)按 ID 和 RankForId 对数据进行排序(选择两者并升序排序):

转置数据:


从列菜单中删除标签列和合并行列:

如果需要,删除不必要的列并连接回原始数据表。
交互式解决方案可能与脚本版本的关系有不同的顺序