[英]Assign data.table column values based on a value being in a certain range
所以我有兩個data.tables。
size_categories = data.table(category = c("S", "M", "L"), size_min = c(0, 10, 25),
size_max = c(10, 25, Inf), bin = c("blue", "red", "green"))
products = data.table(object_id = 1:10, size = seq(1, 37, 4))
我想合並這些表,以便根據其大小為產品表的每一行分配一個 bin 和 size 類別。
我知道的笨拙的方法是為產品的每一行分配一個類別,然后合並
products[size >= 0 & size < 10, category := "S"]
products[size >= 10 & size < 25, category := "M"]
products[size >= 25, category := "L"]
merge(products, size_categories)
當然,這根本不靈活,如果 size_categories 發生變化,我將不得不重寫它。
我願意使用其他軟件包,但更喜歡僅使用 data.table 的解決方案。
謝謝!
我會用非 equi 加入來做到這一點:
products[size_categories, `:=`(category = i.category, bin = i.bin),
on = .(size >= size_min, size < size_max)]
# > products
# object_id size category bin
# 1: 1 1 S blue
# 2: 2 5 S blue
# 3: 3 9 S blue
# 4: 4 13 M red
# 5: 5 17 M red
# 6: 6 21 M red
# 7: 7 25 L green
# 8: 8 29 L green
# 9: 9 33 L green
# 10: 10 37 L green
作為參考,這是一種使用foverlaps
的方法:
foverlaps(setkey(size_categories, size_min, size_max),
setkey(products[, size2 := size], size, size2))[, size2 := NULL][]
# object_id size category size_min size_max bin
# 1: 1 1 S 0 10 blue
# 2: 2 5 S 0 10 blue
# 3: 3 9 S 0 10 blue
# 4: 4 13 M 10 25 red
# 5: 5 17 M 10 25 red
# 6: 6 21 M 10 25 red
# 7: 7 25 M 10 25 red
# 8: 7 25 L 25 Inf green
# 9: 8 29 L 25 Inf green
# 10: 9 33 L 25 Inf green
# 11: 10 37 L 25 Inf green
如果您的“size_categories”表包含更多您希望包含在最終 output 中的列,這可能會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.