使用通过比较获得的值填充创建的列
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),比较 date
和 Read 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 创建
假设我有两个表:
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),比较 date
和 Read 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 创建