forループを使わずにリストのリストを置き換えます(summate())。次のスクリプトのようにリストのリストを転置して、各行を列ではなくグループにまとめる方法を誰かが考えることができます。
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;
これのために私は12の2つのリストから12の2つのリストへそれを変えたいです。
私がこの課題を好むか、すでに何かをしていると私が思うと思う少数の人々を追加します。
@pmroz 、 @Justin_Chilton 、 @ gzmorgan0 、 @msharp 、 @ミズ
forループを使わずにリストのリストを転置する(summate())繰り返し:MSあなたの繰り返しの解決策はとてもいいです。:)
forループを使わずにリストのリストを転置する(summate())MS、繰り返し発情がとても素敵です!
forループを使わずにリストのリストを転置する(summate())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ループを使わずにリストのリストを転置する(summate())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ループを使わずにリストのリストを転置する(summate())これが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ループを使わずにリストのリストを転置する(summate())私はこの方法を見つけましたが、遅いです。 
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ループを使わずにリストのリストを転置する(summate())PMROZのforループは入れ子になっているのがおそらく最善です。 あなたが代替案を探しているなら、私は2つの追加の方法を考えることができます。
あなたのデータがすべて数値であるならば、あなたはかなり滑らかになるであろうマトリックスを使用することができます。 これはforループを持っていませんが、数値列の場合でも、summateizeから返されるリストのリストはすべての文字値を返します。 つまり、すべてのデータを列に変換するには、すべてを数値に変換するための入れ子になったforループが必要になるので、問題にはなりません。
2番目のオプションは、リストのリストをデータテーブルに変換し、それを転置してから元に戻すことです。 これは変換のために2つの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ループを使わずにリストのリストを転置する(summate())DOH!私はあなたが結果をテーブルに書き、それを転置し、そしてテーブルからリストを作成することができると思います。それでもまだforループがあるかもしれません。 うーん...
forループを使わずにリストのリストを転置する(summate())forループなしの部分は読んでいないようです。:P
forループを使わずにリストのリストを転置する(summate())それは金時計ではありませんが、それはうまくいきます。
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"}};Re:forループなしでリストのリストを転置する(summarize())まったく同じ質問がありました@vince_faller 。 質問してくれてありがとう。 このような機能を次のバージョンのJMPに追加するようリクエストを投稿しました。 どれどれ...
https://community.jmp.com/t5/JMP-Wish-List/Transpose-List-of-Lists-without-a-for-loop/idi-p/348968