微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R: unequi join with merge function

如何解决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 举报,一经查实,本站将立刻删除。