<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” )) ;