我有一个这样的数据库
key - value
0 10
1.2 20
2.7 25
3.5 35
...
我想创建一个函数,该函数在给定连续键的情况下检索相关值,例如对于0.2或0.4,应返回10;对于[2.7,3.5 [中的任何值,应返回25;高于或等于最后一个键的所有值应返回35。
原始数据结构是一个数据框,目前我在它的每一行上使用循环,但是我想知道其他哪种数据结构(可能在Base中)会更有效,尤其是在查询中。
答案 0 :(得分:4)
如果您的key
已排序,则假设df
是存储数据的DataFrame
,这样的事情应该很有效:
df.value[searchsortedlast(df.key, value_you_want_to_find)]
使用屏障将其包装在函数中可能会更快一些(但我想不是很多):
range_find(df::AbstractDataFrame, val) =
_range_find(df.key, df.value, val)
_range_find(key::AbstractVector, value:AbstractVector, val) =
value[searchsortedlast(key, val)]
编辑:
根据您的范围条件,应该为searchsortedlast
。
请注意,如果您将val
设置为小于values
的最小值,则此函数将引发错误,但是如果您传递的val
大于最后一个值,则该函数将返回最后一个值(本质上,最后一个间隔假定为[df.values[end], Inf[
。如果您希望对“边界”使用其他行为,则必须手动添加一些其他检查。