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