R:unequi join with merge 函数
R: unequi join with merge function
我正在与 data.table
一起工作,我想做一个非等距 join/merge。
我有一个 table 带有汽车价格,另一个 table 用于识别每辆车属于哪辆车 class:
data_priceclass <- data.table()
data_priceclass$price_from <- c(0, 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)
我使用非等连接来合并两个 table。但是 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
table 中的两行上进行匹配,但是由于 x[y] 删除了重复项,我在输出。通常当我加入时我总是使用 merge
函数而不是 x[y],因为当我使用 x[y].
时我失去了控制
但以下不适用于非 equi 连接:
merge(cars, data_priceclass,
by = c("car_price >= price_from",
"car_price < price_to"),
all.x = T , all.y = F)
关于如何使用 data.table 进行不删除重复项的非等值连接的任何提示?
如评论中所述,cars
上的左连接是通过在 DT[i,j,by]
语法中使用 cars
作为子集条件 i
完成的。
这将 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, .(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: 1900000 NA NA NA
2: 5000000 NA NA NA
我正在与 data.table
一起工作,我想做一个非等距 join/merge。
我有一个 table 带有汽车价格,另一个 table 用于识别每辆车属于哪辆车 class:
data_priceclass <- data.table()
data_priceclass$price_from <- c(0, 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)
我使用非等连接来合并两个 table。但是 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
table 中的两行上进行匹配,但是由于 x[y] 删除了重复项,我在输出。通常当我加入时我总是使用 merge
函数而不是 x[y],因为当我使用 x[y].
但以下不适用于非 equi 连接:
merge(cars, data_priceclass,
by = c("car_price >= price_from",
"car_price < price_to"),
all.x = T , all.y = F)
关于如何使用 data.table 进行不删除重复项的非等值连接的任何提示?
如评论中所述,cars
上的左连接是通过在 DT[i,j,by]
语法中使用 cars
作为子集条件 i
完成的。
这将 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, .(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: 1900000 NA NA NA
2: 5000000 NA NA NA