将列表组合放入列中我试图列出一个事物列表,并使所有可能的组合对出现在一组两列中。我目前生成了一个执行排列的脚本(加上在 col a 和 col b 中重复相同的值),但我正在努力研究如何将其减少为组合。 例如,如果列表是 1、2、3、4、5,那么我不需要同时使用 1/2 和 2/1,或者 1/1。以下是我目前拥有的脚本,我认为我已经接近了,我只需要更多一点即可到达我需要的地方。 我只需要让这个脚本严格选择任意列表的 2 个组合。 为了简单起见,这个特定示例使用了 5 个东西。谢谢
Names Default To Here( 1 );
New Table( "Test",
Add Rows( 5 ),
New Column( "API 10", Numeric, "Continuous", Format( "Best", 15 ), Set Values( [4238939261, 4238939263, 4238939262, 4238939328, 4238939329] ) ),
);
Test = Data Table( "Test" );
APIs = Test:API 10 << get values;
working = New Table( "TestAPIComb", New Column( "API10" ), New Column( "API102" ), add rows( N Items( APIs ) ^ 2 ) );
APIs2 = Test:API 10 << get values;
theRow = 0;
For( APICNT = 1, APICNT <= N Items( APIs ), APICNT++,
For( API2CNT = 1, API2CNT <= N Items( APIs2 ), API2CNT++,
theRow++;
:API10[theRow] = APIs[APICNT];
:API102[theRow] = APIs[API2CNT];
)
);
质量和工艺工程回复:将列表组合放入列中我还应该提到,我使用的示例是字符串。 如果您使用数字,则可以使用直接矩阵运算,这非常快...... 200 万行表在 0.3 秒内生成,26choose5 表在 0.04 秒内生成。
Names Default To Here(1);
nums = J(2e3, 1, randominteger(1e9));
t1 = hptime();
astable(shape(nums[nChoosekMatrix( 2e3, 2 )], ., 2));
t2 = hptime();
Print( Eval Insert( "Create table of 2 numbers chosen from 2000: ^(t2-t1)/1e6^ seconds." ) );
// 26 choose 5
nums = J(26, 1, randominteger(1e9));
t3 = hptime();
astable(shape(nums[nChoosekMatrix( 26, 5 )], ., 5));
t4 = hptime();
Print( Eval Insert( "Create table of 5 numbers chosen from 26: ^(t4-t3)/1e6^ seconds." ) );

回复:将列表组合放入列中至于性能。
下面的代码在不到 6 秒的时间内从 2000 个行的集合中生成了近 200 万行的对表,这略低于循环所用时间的一半。 不知道这样的表现是否适合你的目的。 希望这对您来说是一个可行的选择。
Names Default To Here( 1 );
letters = Words( "abcdefghijklmnopqrstuvwxyz", "" );
// create a large list of random strings of length 10. use an AA to remove (unlikely) duplicates
lis = Associative Array( Repeat( {Concat Items( letters[J( 10, 1, Random Integer( 26 ) )], "" )}, 2e3 ) ) << get keys;
t1 = HP Time();
// looping solution
dt = new table( "xx", add rows (2e6), << new column ("X", character), <<NEW column=""></NEW>

回复:将列表组合放入列中你好,
NchooseK Matrix( ) 函数就是为此类问题量身定制的。 它也相当快,对于 k>2 特别有用。 查看下面的代码,了解从 26 项中选择的 2 项和 5 项的示例。
干杯,
布雷迪
names default to here(1);
lis = words("abcdefghijklmnopqrstuvwxyz","");
// original example: choose 2
dt = astable( nchoosekMatrix(nitems(lis), 2), << column names({"x", "y"}) );
dt << new column ("first", character, << set values ( lis[dt:x << get values]));
dt << new column ("second", character, << set values ( lis[dt:y << get values]));
dt << delete columns (1::2);
// a more interesting example: choose 5
dt = astable( nchoosekMatrix(nitems(lis), 5), << column names( words("x1,x2,x3,x4,x5",",") ) );
for each ({ i }, 1::5, //i = 1;
eval (substitute( expr(dt << new column ( "y"||char(i), character, <<SET values=""></SET>回复:将列表组合放入列中无需进行太多更改,您只需使用初始列表作为数字,然后创建转换表以根据这些数值连接字符值。
回复:将列表组合放入列中你好@jthi ,如果初始列表是字符串而不是数字,有什么想法吗? 由于矩阵仅适用于数字数据类型。
回复:将列表组合放入列中我不知道哪种方法效果最快。我的建议是运行它们,看看哪个最快。
回复:将列表组合放入列中谢谢。 我看了看什么@tx尼尔森建议并实现了笛卡尔连接,它返回 15 个结果而不是 10 个。 然后,我只是在末尾添加了一个简单的选择条件,如果第一列=第二列,那么我也删除了它们。 你们知道 JMP 中哪种方法更快吗?我正在处理一个大型数据集,我也会尝试该矩阵方法,但只是不知道你们中的任何一个人是否知道什么应该更有效。
回复:将列表组合放入列中最有可能的是有很多方法可以做到这一点(笛卡尔连接@tx尼尔森是一个很好的起点)。 这是仅使用矩阵计算的一种选项:
Names Default To Here(1);
// input list
m = [4238939261, 4238939263, 4238939262, 4238939328, 4238939329];
n_items = N Items(m);
// combination count
comb_count = Summation(i = 1, n_items - 1, i++);
m = Sort Ascending(m);
first_col = [];
second_col = [];
For(i = 2, i <= n_items, i++,
first_col ||= Repeat(m[i - 1], n_items - i + 1)`;
second_col ||= m[Index(i, n_items)]`;
);
dt = New Table("Combinations",
Add Rows(comb_count),
New Column("FirstCol", Numeric, Continuous, Values(first_col)),
New Column("SecondCol", Numeric, Continuous, Values(second_col)),
);

回复:将列表组合放入列中我添加了几行代码来消除重复的组合。另外,我建议你研究一下
表=>连接
在笛卡尔连接能力。

它生成所有可能的组合的速度比 JSL 代码快得多。
Names Default To Here( 1 );
New Table( "Test",
Add Rows( 5 ),
New Column( "API 10", Numeric, "Continuous", Format( "Best", 15 ), Set Values( [4238939261, 4238939263, 4238939262, 4238939328, 4238939329] ) ),
);
Test = Data Table( "Test" );
APIs = Test:API 10 << get values;
working = New Table( "TestAPIComb", New Column( "API10" ), New Column( "API102" ), add rows( N Items( APIs ) ^ 2 ) );
APIs2 = Test:API 10 << get values;
theRow = 0;
For( APICNT = 1, APICNT <= N Items( APIs ), APICNT++,
For( API2CNT = 1, API2CNT <= N Items( APIs2 ), API2CNT++,
theRow++;
:API10[theRow] = APIs[APICNT];
:API102[theRow] = APIs[API2CNT];
)
);
dt = Data Table( "TestAPIcomb" );
// Arange data so order is the same for all rows
For( i = 1, i <= N Rows( dt ), i++,
If( :API102[i] > :API10[i],
hold = :API10[i];
:API10[i] = :API102[i];
:API102[i] = hold;
)
);
// Find the duplicates
dt << Select Duplicate Rows( :API10, :API102 );
// Delete the duplicates
dt << delete rows;