我有2个数据表:items和category
require(data.table)
set.seed(1L) # for reproducibility
category <- data.table(from = c(0,8,15,25,45.5,90,101),
to = c(5,12,20,39,60,100,99999),
class = c("A","B","C","D","E","F","G"))
items <- data.table(weight = sample(0:999,10000,replace=TRUE))
Run Code Online (Sandbox Code Playgroud)
我希望"items"中的每一行都有一个类标签,例如,如果第一项的权重为7,它就会选择"B"类.类别权重不必跨越所有权重,可能存在间隙,因此类别A为0-5,B为8-12,C为15-20等
我可以在数据框中执行此操作%in%,但"item"数据集有1000万个项目,"category"数据集有200多个类别),因此我尝试在数据表中执行此操作.
我该怎么做?
使用non-equi当前开发版本的data.table 的连接(新功能)v1.9.7,
category[, to2 := shift(from, type="lead", fill=to[.N]+1L)]
items[category, result := class, on=.(weight >= from, weight < to2)]
Run Code Online (Sandbox Code Playgroud)
而已.对于每个category,items根据提供给on=参数的条件找到相应的匹配行.然后那些匹配的行得到相应的值class.
请参阅安装说明这里.