如何解决R: unequi join with merge function
我正在与 data.table
合作,我想做一个非对等的左加入/合并。
我有一张表显示汽车价格,另一张表用于确定每辆车属于哪个汽车类别:
data_priceclass <- data.table()
data_priceclass$price_from <- c(0,200000,250000,300000,350000,425000,500000,600000,700000,800000,900000,1000000,1100000,1200000,1300000,1400000,1500000,1600000,1700000,1800000)
data_priceclass$price_to <- c(199999,199999,249999,299999,349999,424999,499999,599999,699999,799999,899999,999999,1099999,1199999,1299999,1399999,1499999,1599999,1699999,1799999,1899999)
data_priceclass$price_class <- c(1:20,99)
我使用非对等连接来合并两个表。但是 data.table
的 x[y]-join 语法会删除重复项。
cars <- data.table(car_price = c(190000,500000))
cars[data_priceclass,on = c("car_price >= price_from","car_price < price_to"),price_class := i.price_class,]
cars
请注意,值 190000 的汽车应该在 data_priceclass
表中的两行上获得匹配项,但由于 x[y] 删除了重复项,因此我在输出中看不到这一点。通常,当我加入时,我总是使用 merge
函数而不是 x[y],因为我在使用 x[y] 时会失去控制。
但以下不适用于非等连接:
merge(cars,data_priceclass,by = c("car_price >= price_from",all.x = T,all.y = F)
关于如何对不删除重复项的 data.table 进行非等连接的任何提示?
解决方法
如评论中所述,cars
上的左连接是通过在 cars
语法中使用 i
作为子集条件 DT[i,j,by]
来完成的。
这将 cars
放在右侧,与 SQL
相比,这可能违反直觉,我发现此 tutorial 对比较两种语法很有用。
cars <- data.table(car_price = c(190000,500000))
data_priceclass[cars,.(car_price,x.price_from,x.price_to,price_class),on = .(price_from <= car_price,price_to > car_price)]
car_price x.price_from x.price_to price_class
1: 190000 0e+00 199999 1
2: 190000 0e+00 199999 2
3: 500000 5e+05 599999 8
如果你提高汽车价格:
cars <- cars * 10
data_priceclass[cars,price_to > car_price)]
car_price x.price_from x.price_to price_class
1: 1900000 NA NA NA
2: 5000000 NA NA NA
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。