如何根据另一个查询表/数据帧自动为一个数据帧插入值?

时间:2019-06-10 05:33:17

标签: r dplyr data.table interpolation lookup-tables

我有一个数据框和一个查询表。我想要将df_dat$valuedf_lookup$threshold进行比较。 如果value落入threshold范围内,则在transfer中创建一个新列df_dat,以使其值为 从transfer的{​​{1}}列进行线性内插

df_lookup

我可以像这样手动进行操作,但是想知道是否有基于library(dplyr) df_lookup <- tribble( ~threshold, ~transfer, 0, 0, 100, 15, 200, 35 ) df_lookup #> # A tibble: 3 x 2 #> threshold transfer #> <dbl> <dbl> #> 1 0 0 #> 2 100 15 #> 3 200 35 df_dat <- tribble( ~date, ~value, "2009-01-01", 0, "2009-01-02", 30, "2009-01-06", 105, "2009-01-09", 150 ) df_dat #> # A tibble: 4 x 2 #> date value #> <chr> <dbl> #> 1 2009-01-01 0 #> 2 2009-01-02 30 #> 3 2009-01-06 105 #> 4 2009-01-09 150 表中值的自动方法吗?谢谢。

df_lookup

2 个答案:

答案 0 :(得分:3)

您可以使用approx

df_dat %>% mutate(transfer = with(df_lookup, approx(threshold, transfer, value))$y)
## A tibble: 4 x 3
#  date       value transfer
#  <chr>      <dbl>    <dbl>
#1 2009-01-01     0      0
#2 2009-01-02    30      4.5
#3 2009-01-06   105     16
#4 2009-01-09   150     25

答案 1 :(得分:2)

另一个使用roll的选项:

df_lookup[, m := (transfer - shift(transfer, -1L)) / (threshold - shift(threshold, -1L))]

df_dat[, tx := 
    df_lookup[df_dat, on=c("threshold"="value"), roll=Inf, 
        x.m * (i.value - x.threshold) + x.transfer]
]

数据:

library(data.table)
df_lookup <- fread("threshold, transfer
0,   0
100,   15
200,   35")

df_dat <- fread('date, value
"2009-01-01", 0
"2009-01-02", 30
"2009-01-06", 105
"2009-01-09", 150')