R语言查找夹在新数据点两侧最邻近行的方法验证咨询
方案参考
你当前写的方法有两个明显问题:
- 逻辑不严谨:仅按与新点的绝对差值排序取前两行,无法保证两个值分别落在新点两侧。如果新点比数据集里所有值都小/都大,或者紧邻新点的两个值都在同一侧,就会返回两个都大于/都小于新点的结果,完全不符合“一个略大、一个略小”的要求。
- 效率冗余:你在构造数据集时已经对
variable字段做了升序排序,后续再计算差值、对全表重新排序属于重复操作,数据量越大性能浪费越明显。
最高效实现方案
因为你已经提前把数据集按variable升序排好序了,直接用R内置的findInterval()函数找分界点即可,时间复杂度是O(log n),远快于全表排序的O(n log n),且逻辑完全匹配需求:
new_point <- 4.1 # 找到最后一个variable值小于new_point的行位置 pos <- findInterval(new_point, sandwich$variable) # 边界情况判断 if (pos == 0) { warning("新点小于数据集内所有值,仅返回最小的1行数据") final_rows <- sandwich[1, ] } else if (pos == nrow(sandwich)) { warning("新点大于数据集内所有值,仅返回最大的1行数据") final_rows <- sandwich[nrow(sandwich), ] } else { # pos对应小于新点的最近行,pos+1对应大于新点的最近行 final_rows <- sandwich[c(pos, pos+1), ] }
小提示:如果你的数据集中可能存在和
new_point完全相等的值,只需要把findInterval的参数加个left.open = TRUE,就能拿到严格小于新点的最近行,避免把等值行误归为“略小”的一侧。
结果验证
拿你提供的测试数据跑上述代码,返回的两行variable值分别是3.683854和4.617823,正好卡在4.1的两侧,是符合要求的最近邻两行。
如果用你原来的方法跑这个测试数据虽然结果碰巧正确,但只要换个边界场景(比如new_point=1,比数据集里所有值都小),原方法就会返回两个都大于1的行,直接出错。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

