【问题标题】:Assign data.table column values based on a value being in a certain range根据某个范围内的值分配 data.table 列值
【发布时间】:2021-03-24 02:36:28
【问题描述】:

所以我有两个 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 和大小类别。

我知道的笨拙的方法是为产品的每一行分配一个类别,然后合并

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 的解决方案。

谢谢!

【问题讨论】:

    标签: r join merge data.table data-manipulation


    【解决方案1】:

    我会用非 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,但我相信这需要复制一列并设置键。 +1
    • 非常感谢!假设 size_category 有更多列,我想保留其中的大部分。我是否必须以类似的方式将它们全部列出,还是有更快的方法?
    • @paxton 在这种情况下,连接比就地修改更合适。我希望我之前对类似问题的回答中的示例会有所帮助:stackoverflow.com/a/65004418/3926543
    【解决方案2】:

    作为参考,这里有一个使用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”表包含更多您希望包含在最终输出中的列,这可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-01-01
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 2019-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多