JMP 社区您好,
我有两个不同的数据表,它们共享一列,即批号(简称批号)。 (在 W10 上运行 JMP Pro 14.1.0)
数据表来自两个不同的源,并且其中的行数不同。 我想使用其中一个数据表来选择另一个数据表中的匹配行。 批次中的值是连续/数字。 dt1 有 1430 行,dt2 有 158 行。 dt1 中的批次比 dt2 中的批次多,因此我需要使用 dt2 来仅选择 dt1 中的匹配批次。
我以为我可以做一个简单的: dt1<
我想我可以使用两个 for 循环来做到这一点,其中对于 dt1 中的每一行,它将循环遍历 dt2 以查看它们在哪里相等,不幸的是,这会导致 225940 次比较,我认为这很容易,但 JMP 花费的时间要长得多比我想象的要好。
这是我写的选择代码:
For(l=1, l<=NRows(dt1), l++,
For(i=1, 1<=NRows(dt2), i++,
dt1<<SELECT where=""></SELECT>但这不起作用。 它似乎陷入了无限循环(不得不强制退出JMP)。
我在写这篇文章时做了一些阅读,因为我需要保留所有以前选择的行,所以我需要调用当前选择(“扩展”)选项。 所以,我肯定知道上面的代码不会工作,但它应该做一些事情。
一定有比 For 循环更快、更优雅的方法。
非常感谢任何反馈。
谢谢!,
DS
这里有两种方法可以做到这一点。第一种方法使用您的方法,但是,对于大数据表来说,它会很慢
Names Default To Here( 1 );
// create sample data
dtMain = New Table( "Main",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "b", "c", "d", "e", "a", "b", "c"} )
)
);
dtSmall = New Table( "Small",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "e"} ),
Set Display Width( 49 )
)
);
Names Default To Here( 1 );
dtMain << clear select;
For( i = 1, i <= N Rows( dtSmall ), i++,
dtMain << select where(
dtMain:Lot == dtSmall:Lot[i],
current selection( "extend" )
)
);
第二个会更有效地工作
Names Default To Here( 1 );
// create sample data
dtMain = New Table( "Main",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "b", "c", "d", "e", "a", "b", "c"} )
)
);
dtSmall = New Table( "Small",
Add Rows( 2 ),
New Column( "lot",
Character,
"Nominal",
Set Values( {"a", "e"} ),
Set Display Width( 49 )
)
);
// Create a new column as a Select indicator
dtSmall << New Column( "Select", set each value( 1 ) );
// Update the Main table with values from the Small table
dtMain << Update( With( dtSmall ), Match Columns( :lot = :lot ) );
// Select the matching columns
dtMain << select where( :select == 1 );
// get rid of select columns
dtMain << delete columns( "Select" );
dtSmall << delete columns( "Select" );