轉置列表列表 (summarize()),無需 for 循環任何人都可以想出一種方法來轉置列表列表(如以下腳本中的內容),以便將每一行而不是按列分組在一起。
我知道我可以用 for 循環來做到這一點,但我想知道是否有更好或更簡單的方法。
Names default to here(1);
dt = open("$SAMPLE_DATA\Big Class.jmp");
summarize(dt, d = By(:age, :sex));
rows = nitems(d);
cols = nitems(d[1]);
show(rows, cols);
// rows = 2;
// cols = 12;
為此,我想將其從 2 個 12 個列表更改為 12 個 2 個列表。
添加一些我認為可能喜歡這個挑戰或已經擁有一些東西的人。
@pmroz , @Justin_Chilton , @gzmorgan0 , @msharp , @多發性硬化症
回复:在沒有 for 循環的情況下轉置列表列表(summarize())我有完全相同的問題@vince_faller 。 謝謝你的詢問。 我已發布請求,要求將此類功能添加到下一版本的 JMP 中。 讓我們來看看...
https://community.jmp.com/t5/JMP-Wish-List/Transpose-List-of-Lists-without-a-for-loop/idi-p/348968
回复:在沒有 for 循環的情況下轉置列表列表(summarize())重複:MS你的重複解決方案非常好。 
回复:在沒有 for 循環的情況下轉置列表列表(summarize())MS,重複一下,非常好!
回复:在沒有 for 循環的情況下轉置列表列表(summarize())Names default to here(1);
dt = open("$SAMPLE_DATA\Big Class.jmp");
//Since column formulas are by row, it uses a built in For Loop this maintains the table values but requires a table....<BR />//This is not a solution for two generic lists<BR />
dt << New Column( "Age,Sex",
Expression,
"None",
Formula( Eval List( {:age[Empty()], :sex[Empty()]} ) ),
Suppress Eval
);
myList= (Associative Array(Column("Age,Sex")) <<GET keys=""></GET>回复:在沒有 for 循環的情況下轉置列表列表(summarize())使用 JMP 14 中的新 Python 掛鉤,我認為我可以作弊。它大部分有效。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA\Big Class.jmp");
Summarize(dt, d = By(:age, :sex));
Python Init();
ml = Python Execute(
{d},
{x, d},
"\[
import numpy as np
x = np.transpose(d) # matrix product
print('x=', x)
]\"
);
Show( x, d );
Python Term();回复:在沒有 for 循環的情況下轉置列表列表(summarize())這是一個基於 Repeat() 的想法。 該函數本質上是一個循環,但直接返回列表,而不需要循環任何賦值。
在 JMP 的早期版本中,我發現在構建列表時 Repeat() 比 For() 快得多,但我認為這在 JMP 13 中已“修復”。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA\Big Class.jmp");
Summarize(dt, d = By(:age, :sex));
transposed_d = Local({i = 0}, Repeat({i++ ; Eval List({d[1][i], d[2][i]})}, N Items(d[1])));
回复:在沒有 for 循環的情況下轉置列表列表(summarize())我找到了這種方法,但速度較慢。:(
Names default to here(1);
dt = open("$SAMPLE_DATA\Big Class.jmp")
summarize(dt, list = By(:age, :sex));
rows = nitems(list[1]);
cols = nitems(list);
list_flat = parse("{"||substitute(char(list), "}", "", "{", "")||"}");
insert into(list_flat, repeat({"@@@"}, rows));
list_sort = list_flat[ shape(1::rows*(cols+1), cols+1)` ];
remove from(list_sort, -1);
t_list = parse("{"||
substitute(char(list_sort),
", \!"@@@\!",", "},{"
)
||"}");
回复:在沒有 for 循環的情況下轉置列表列表(summarize())PMROZ 的嵌套 for 循環可能是最好的。如果您正在尋找替代方案,我可以想到另外兩種方法。
如果您的數據都是數字,您可以使用非常光滑的矩陣。然而,這沒有 for 循環,從匯總返回的列表列表返回所有字符值,即使對於數字列也是如此。這意味著您需要一個嵌套的 for 循環來將所有內容轉換為數字(如果您的所有數據都是列),這樣這對您的問題沒有幫助。
第二個選項是將列表列表轉換為數據表,轉置它,然後返回。這需要兩個 for 循環進行轉換(我不知道有什麼巧妙的方法可以在嵌套列表和數據表之間進行轉換)。這可能比 PMROZ 的解決方案慢,因為您需要創建數據表的開銷,但是,對於較大的數據集,它可能會更快。如果您實際上沒有轉換回列表列表,而只是使用轉置的數據表,那麼您也可以節省一些時間。
Names default to here(1);
dt = open("$SAMPLE_DATA\Big Class.jmp");
summarize(dt, d = By(:age, :sex));
rows = nitems(d);
cols = nitems(d[1]);
show(rows, cols);
//Turn List of Lists into DT ()
dtLL = New Table("Lists of Lists");
for(i=1,i<=nitems(d),i++,
dtLL << New Column(char(i), Character, Nominal, Values(d[i]));
);
//Transpose DT
cols = dtLL << Get Column Names;
dtT = dtLL << Transpose(columns(cols));
//Turn back into list of lists
trans_list = {};
for(i=2,i<=ncols(dtT),i++,
trans_list[i] = column(dtT,i) <<GET values=""></GET>回复:在沒有 for 循環的情況下轉置列表列表(summarize())衛生部!我想您可以將結果寫入表中,轉置該結果,然後從表中創建列表。 不過那裡可能仍然有一個 for 循環。嗯嗯...
回复:在沒有 for 循環的情況下轉置列表列表(summarize())我覺得你沒有閱讀沒有 for 循環的部分。 :p
回复:在沒有 for 循環的情況下轉置列表列表(summarize())這不是金表,但很實用。
Names default to here(1);
dt = open("$SAMPLE_DATA\Big Class.jmp");
summarize(dt, d = By(:age, :sex));
nrows = nitems(d);
ncols = nitems(d[1]);
show(nrows, ncols);
// nrows = 2;
// ncols = 12;
trans_list = {};
for (i = 1, i <= ncols, i++,
one_list = {};
for (k = 1, k <= nrows, k++,
one_list[k] = d[k][i];
);
trans_list[i] = one_list;
);
show(trans_list);
trans_list = {{"12", "F"}, {"12", "M"}, {"13", "F"}, {"13", "M"}, {"14", "F"}, {"14", "M"}, {"15", "F"}, {"15", "M"}, {"16", "F"}, {"16", "M"}, {"17", "F"}, {"17", "M"}};