使用通过比较获得的值填充创建的列

Populating a created column with values obtained by comparison

假设我有两个表:

tableOne <- data.frame(date = c("2022-01-14", "2022-03-15", "2022-05-20", "2022-06-02", "2022-08-21"),
                       eqmt = c("EQ01","EQ02","EQ02","EQ01","EQ02"),
                       values = c( 18,20, 24, 25, 27)
                       )

tableTwo <- data.frame( `Read Date` =c("2022-03-27", "2022-04-10", "2022-02-05","2022-07-19", "2022-08-20"),
                        Plant = c("EQ02", "EQ02", "EQ01", "EQ01","EQ02"),
                        Reading = c(205, 215, 370, 420, 260)
                        )

我想要的代码将查看 eqmt 列中的条目,找到 tableTwo 中具有相应值的行(例如,当代码位于 tableOne,它应该将 tableTwo 中的第 3 行和第 4 行标识为在 plant 列中具有条目 EQ01),比较 dateRead Date 条目和 return,tableOne 中新列中的每行,Read Date 值大于给定行中的 date

如果我理解正确,这将回答您的问题:

tableOne %>%
  left_join(tableTwo, by = c("eqmt" = "Plant")) %>%
  filter( as.Date(Read.Date) > as.Date(date) )

        date eqmt values  Read.Date Reading
1 2022-01-14 EQ01     18 2022-02-05     370
2 2022-01-14 EQ01     18 2022-07-19     420
3 2022-03-15 EQ02     20 2022-03-27     205
4 2022-03-15 EQ02     20 2022-04-10     215
5 2022-03-15 EQ02     20 2022-08-20     260
6 2022-05-20 EQ02     24 2022-08-20     260
7 2022-06-02 EQ01     25 2022-07-19     420

但是,由于有多个 Read.Date 大于日期的匹配项,您最终会得到比最初更多的行。

另一种方法可能是尝试 fuzzyjoin 包。您可以提供两个 data.frames,表示要连接的列,以及 match_fun 表示用于比较的相等函数。

library(fuzzyjoin)

fuzzy_inner_join(
  tableOne,
  tableTwo,
  by = c("eqmt" = "Plant", "date" = "Read.Date"),
  match_fun = c(`==`, `<`)
)

输出

        date eqmt values  Read.Date Plant Reading
1 2022-01-14 EQ01     18 2022-02-05  EQ01     370
2 2022-01-14 EQ01     18 2022-07-19  EQ01     420
3 2022-03-15 EQ02     20 2022-03-27  EQ02     205
4 2022-03-15 EQ02     20 2022-04-10  EQ02     215
5 2022-03-15 EQ02     20 2022-08-20  EQ02     260
6 2022-05-20 EQ02     24 2022-08-20  EQ02     260
7 2022-06-02 EQ01     25 2022-07-19  EQ01     420

您可以使用{powerjoin}:

library(powerjoin)

power_inner_join(
  tableOne,
  tableTwo,
  by = c(eqmt = "Plant", ~ .x$date < .y$Read.Date)
)
#>         date eqmt values  Read.Date Reading
#> 1 2022-01-14 EQ01     18 2022-02-05     370
#> 2 2022-01-14 EQ01     18 2022-07-19     420
#> 3 2022-03-15 EQ02     20 2022-03-27     205
#> 4 2022-03-15 EQ02     20 2022-04-10     215
#> 5 2022-03-15 EQ02     20 2022-08-20     260
#> 6 2022-05-20 EQ02     24 2022-08-20     260
#> 7 2022-06-02 EQ01     25 2022-07-19     420

reprex package (v2.0.1)

于 2022-04-14 创建