R语言 根据一个数据表中两个字段的值范围为另一个数据表中的字段赋值

dfddblmv  于 2023-03-15  发布在  其他
关注(0)|答案(2)|浏览(187)

我有两个数据表如下:

dt1 <- data.table(range_col = c(1, 7, 10, 15, 20), new_col = NA)
dt2 <- data.table(min_val = c(0, 6, 11, 16), max_val = c(5, 10, 15, 20), value_col = c(100, 200, 300, 400))

现在,根据列“range_col”的值以及数据表“dt2”中“min_val”和“max_val”字段中的值之间的范围,必须将“dt2”的“value_col”中的相应值赋给“dt1”的“new_col”

frebpwbc

frebpwbc1#

我们可以使用不等连接将value_col连接到dt1,然后将其重命名为new_col

library(data.table)

dt1[dt2,
    .(range_col, new_col = value_col),
    on = .(range_col  >= min_val , range_col <= max_val)
    ]

#>    range_col new_col
#> 1:         0     100
#> 2:         6     200
#> 3:         6     200
#> 4:        11     300
#> 5:        16     400

来自OP的数据:

dt1 <- data.table(range_col = c(1, 7, 10, 15, 20), new_col = NA)
dt2 <- data.table(min_val = c(0, 6, 11, 16), max_val = c(5, 10, 15, 20), value_col = c(100, 200, 300, 400))

创建于2023年3月15日,使用reprex v2.0.2

hgqdbh6s

hgqdbh6s2#

您可以使用findInterval

dt1[, new_col := dt2$value_col[findInterval(range_col, dt2$min_val)]]

#    range_col value_col
# 1:         1       100
# 2:         7       200
# 3:        10       200
# 4:        15       300
# 5:        20       400

另一个(更安全的)data.table选项是foverlaps

setkey(dt2, min_val, max_val)
dt1[, range_col2 := range_col]

foverlaps(dt1, dt2, by.x = c("range_col", "range_col2"))[, c("range_col", "value_col")]

dplyr中:

library(dplyr)
inner_join(dt1, dt2, by = join_by(between(range_col, min_val, max_val))) %>% 
  select(range_col, value_col)

相关问题