<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />大家好,
我需要搜索列中某些內容的最接近值。是否有一個函數(我只是找不到)來執行此操作,或者我需要製定自己的例程來執行此操作?
謝謝,娜塔莉
使用
col = Column( dtFile1, "X_location" );
JMP 對象(如 dtFile1 中的數據表)通常會默默地忽略它們不理解的消息(如 <回复:搜索最近值
抱歉回复較慢;我被別的事纏住了。我最初嘗試了你的第二個解決方案,但我根本無法讓它工作。我什至無法讓它找到該列的最小值......這是怎麼回事?我注意到我的列是字符串列,而不是數字列,因此我對其進行了轉換,但這似乎沒有任何幫助。
柱子( dt文件1 , “X_位置” ) <<數據類型( “數字” ) ;
坳= dt文件1 <<柱子( “X_位置” ) ;
行=洛克敏(((坳<<獲取值))) ;
另一種使用 KDTable 的方法。
dt = Open( "$sample_data/big class.jmp" );
// 創建 kdtable 的輸入矩陣: [95 59, 123 61, 74 55, ...
數據 = (dt:權重 << getasmatrix) || (dt:高度 << getasmatrix);
// 創建查找表
查找 = KDTable( 數據 );
// 做一個查找示例:找到距離體重 100 磅、身高 60 最接近的 10 個人
// 距離 5 內的英寸。(5 與重量和磅的“單位”相同...標準化?)
{rowNumbers, 距離} = 查找 << knearestrows( {10, 5}, [100 60] );
// 顯示結果
For( irow = 1, irow <= N Cols( rowNumbers ), irow++,
rowIndex = rowNumbers[irow];
Write( dt:name[rowIndex], " w=", dt:weight[rowIndex], " h=", dt:height[rowIndex], " d=", distances[irow], "\!n" );
);
/*:
阿爾弗雷德 w=99 h=64 d=4.12310562561766
克里斯 w=99 h=64 d=4.12310562561766
標記 w=104 h=62 d=4.47213595499958
凱蒂 w=95 h=59 d=5.09901951359278
所以 d=4.123 是 sqrt((100-99)^2+(60-64)^2)。當凱蒂被發現時,半徑已超過 5,因此請求的 10 個結果受到半徑的限制。
KDTable 適用於 K 維數據;您可能只需要 K=1(例如,僅體重)或 K=3(也包括年齡)。在此數據中,縮放/歸一化問題隨著年齡的增長而更加明顯,其範圍比身高或體重小得多。13歲到14歲的距離比75斤到80斤的距離是大還是小?
編輯:只要有重量,它看起來就更簡單了:
dt = Open( "$sample_data/big class.jmp" );
// 創建查找表
查找 = KDTable( dt:weight << getasmatrix );
// 做一個查找示例:找到距離 100 磅最近的 10 個人
{rowNumbers, 距離} = 查找 << knearestrows( {10, 5}, [100] );
// 顯示結果
For( irow = 1, irow <= N Cols( rowNumbers ), irow++,
rowIndex = rowNumbers[irow];
Write( dt:name[rowIndex], " w=", dt:weight[rowIndex], " d=", distances[irow], "\!n" );
);
/*:
阿爾弗雷德 w=99 d=1
克里斯 w=99 d=1
約翰 w=98 d=2
標記 w=104 d=4
凱蒂 w=95 d=5
喬伊 w=105 d=5
邁克爾 w=95 d=5
粘土 w=105 d=5
丹尼 w=106 d=6
以下是獲取最接近值的行的兩種方法。 第一個返回行號矩陣,因此允許平局。 對於使用 LocMin() 函數的第二種方法,假設有一個唯一的最接近值;它將僅返回第一個實例的行號並忽略任何關係。
名稱默認為此處( 1 ) ;
dt =打開( “$SAMPLE_DATA\Big Class.jmp” ) ;
坳=柱子( “重量” ) ;
// 選擇最接近某個值的所有行
價值= 99.5 ;
d =腹肌((坳<<獲取值) -價值) ;
行=洛克( d ==最小( d )) ;
展示(行) ;
dt <<選擇行(行) ;
// 選擇最接近某個值的第一行
價值= 112 ;
行=洛克敏(腹肌((坳<<獲取值) -價值)) ;
展示(行) ;
dt <<選擇行(行) ;
或者,您可以創建一個矩陣向量
rowmat=index(1,N 行(dt));
然後使用相同的Rank矩陣對其進行排序
行墊排序 = 行墊;
然後它將包含與排序值矩陣相同順序的行號,因此當您從值矩陣中獲取最近的值位置時,rowmatsorted 矩陣中的相同位置將具有行號
謝謝吉姆,這太棒了。
我絕對可以用這個。但是,我需要知道行號,以便我可以在下一列中獲取相應的值。
使用您的函數並找到最接近的值後,我應該在原始數據中搜索該值以查找行號嗎?
娜塔莉,
這是我編寫的一個簡單函數,它返回最接近目標值的值。
名稱默認為此處( 1 ) ;
dt =打開( “$SAMPLE_DATA\半導體能力.jmp” ) ;
尋找最近的=功能( {價值,坳} ,
{ A ,右,啊,就在上面,略低於,價值,坳} ,
A =柱子(坳) <<獲取值;
右=秩( A ) ;
啊=已排序= A [右] ;
乙= 108 ;
就在上面=啊[洛克(啊>價值)[ 1 ]] ;
略低於=啊[洛克(啊<價值)[ N 行(洛克(啊<乙) )]] ;
如果(就在上面-價值<價值-略低於,
就在上面,
) ;
) ;
展示(最低限度=尋找最近的( 108 , “NPN1” )) ;