<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:weight << getasmatrix) || (dt:height << getasmatrix);
// 創建查找表
查找 = KDTable( 數據 );
// 做一個示例查找:找到最近 10 個體重 100 磅和身高 60 的人
// 5 距離內的英寸。(5 與重量和磅的“單位”相同……歸一化?)
{rowNumbers, distances} = 查找 << knearestrows( {10, 5}, [100 60] );
// 顯示結果
對於(irow = 1,irow <= N 列(rowNumbers),irow++,
rowIndex = rowNumbers[irow];
寫(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)。到發現 Katie 的時候,已經超過了 5 的半徑,所以請求的 10 個結果受到了半徑的限制。
KDTable 處理 K 維數據;您可能只需要 K=1(例如僅體重)或 K=3(還包括年齡)。在此數據中,隨著年齡的增長,縮放/標準化問題更加明顯,其範圍遠小於身高或體重。13歲到14歲的距離是大於還是小於75磅到80磅的距離?
編輯:只有重量,它看起來更簡單:
dt = Open("$sample_data/big class.jmp");
// 創建查找表
查找 = KDTable(dt:weight << getasmatrix);
// 做一個示例查找:找到最近 10 個體重為 100 磅的人
{rowNumbers, distances} = 查找 << knearestrows({10, 5}, [100]);
// 顯示結果
對於(irow = 1,irow <= N 列(rowNumbers),irow++,
rowIndex = rowNumbers[irow];
寫(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 =絕對值((山口<<獲取值) -價值) ;
行= Loc ( d ==敏( d )) ;
節目(行) ;
dt <<選擇行(行) ;
// 選擇最接近某個值的第一行
價值= 112 ;
行=祿敏(絕對值((山口<<獲取值) -價值)) ;
節目(行) ;
dt <<選擇行(行) ;
或者,您可以創建一個矩陣向量
rowmat=索引(1,N行(dt));
然後使用相同的 Rank 矩陣對其進行排序
rowmatsorted = 行墊;
然後它將包含與排序值矩陣相同順序的行號,因此當您從值矩陣中獲得最近的值位置時,rowmatsorted 矩陣中的相同位置將具有行號
謝謝吉姆,這太棒了。
我絕對可以用這個。但是,我需要知道行號,這樣才能在下一列中得到對應的值。
使用您的函數並找到最接近的值後,我是否應該在原始數據中搜索該值以找到行號?
娜塔莉,
這是我編寫的一個簡單函數,它返回最接近目標值的值。
名稱默認到這裡( 1 ) ;
dt =打開( "$SAMPLE_DATA\Semiconductor Capability.jmp" ) ;
找到最近的=功能( {價值,山口} ,
{一個, R ,啊,就在上面,略低於,價值,山口} ,
一個=柱子(山口) <<獲取值;
R =秩(一個) ;
啊=排序的=一個[ R ] ;
b = 108 ;
就在上面=啊[ Loc (啊>價值)[ 1 ]] ;
略低於=啊[ Loc (啊<價值)[ N行( Loc (啊< b ) )]] ;
如果(就在上面-價值<價值-略低於,
就在上面,
) ;
) ;
節目(最低限度=找到最近的( 108 , “NPN1” )) ;