R fuzzyjoin 在最近的记录上
R fuzzyjoin on most recent previous record
我想通过 ID 连接两个表 A 和 B,并在 B 中找到早于 A[date] 的最近日期。
经过一些搜索,fuzzyjoin
似乎允许加入日期范围:
library(fuzzyjoin)
fuzzy_left_join(A, B,
by = c("ID" = "ID",
"date" = "date"),
match_fun = list("==","<"))
问题是这会 return 很多记录(如果它们存在于 B 中),而我只想要最新的。
知道如何进行吗?
编辑:
A <- data.frame(ID=c(1,2,3),
date = c('2019-04-03','2019-05-13','2019-05-27'))
B <- data.frame(ID=c(1,1,2,3,4),
date = c('2018-01-01','2019-01-01','2019-02-20','2019-06-01','2019-01-01'),
value = c(1,1.5,1.2,3.7,4))
> A
ID date
1 1 2019-04-03
2 2 2019-05-13
3 3 2019-05-27
> B
ID date value
1 1 2018-01-01 1.0
2 1 2019-01-01 1.5
3 2 2019-02-20 1.2
4 3 2019-06-01 3.7
5 4 2019-01-01 4.0
预期输出:
ID date value
1 1 2019-04-03 1.5
2 2 2019-05-13 1.2
3 3 2019-05-27 NA
使用 data.table
滚动连接的另一个选项:
library(data.table)
setDT(A)[, date:=as.Date(date)]
setDT(B)[, date:=as.Date(date)]
B[A, on=.(ID, date), roll=Inf]
输出:
ID date value
1: 1 2019-04-03 1.5
2: 2 2019-05-13 1.2
3: 3 2019-05-27 NA
我们可以做 group_by
A 然后 select 每组的最后一行
library(fuzzyjoin)
fuzzy_left_join(A, B,
by = c("ID" = "ID","date" = "date"),
match_fun = list(`==`,`>`)) %>%
group_by(ID.x) %>%
slice(n()) %>%
select(-ends_with('y')) %>%
rename_at(vars(ends_with('x')), ~gsub('.x','',.))
# A tibble: 3 x 3
# Groups: ID.x [3]
ID date value
<dbl> <date> <dbl>
1 1 2019-04-03 1.5
2 2 2019-05-13 1.2
3 3 2019-05-27 NA
我想通过 ID 连接两个表 A 和 B,并在 B 中找到早于 A[date] 的最近日期。
经过一些搜索,fuzzyjoin
似乎允许加入日期范围:
library(fuzzyjoin)
fuzzy_left_join(A, B,
by = c("ID" = "ID",
"date" = "date"),
match_fun = list("==","<"))
问题是这会 return 很多记录(如果它们存在于 B 中),而我只想要最新的。
知道如何进行吗?
编辑:
A <- data.frame(ID=c(1,2,3),
date = c('2019-04-03','2019-05-13','2019-05-27'))
B <- data.frame(ID=c(1,1,2,3,4),
date = c('2018-01-01','2019-01-01','2019-02-20','2019-06-01','2019-01-01'),
value = c(1,1.5,1.2,3.7,4))
> A
ID date
1 1 2019-04-03
2 2 2019-05-13
3 3 2019-05-27
> B
ID date value
1 1 2018-01-01 1.0
2 1 2019-01-01 1.5
3 2 2019-02-20 1.2
4 3 2019-06-01 3.7
5 4 2019-01-01 4.0
预期输出:
ID date value
1 1 2019-04-03 1.5
2 2 2019-05-13 1.2
3 3 2019-05-27 NA
使用 data.table
滚动连接的另一个选项:
library(data.table)
setDT(A)[, date:=as.Date(date)]
setDT(B)[, date:=as.Date(date)]
B[A, on=.(ID, date), roll=Inf]
输出:
ID date value
1: 1 2019-04-03 1.5
2: 2 2019-05-13 1.2
3: 3 2019-05-27 NA
我们可以做 group_by
A 然后 select 每组的最后一行
library(fuzzyjoin)
fuzzy_left_join(A, B,
by = c("ID" = "ID","date" = "date"),
match_fun = list(`==`,`>`)) %>%
group_by(ID.x) %>%
slice(n()) %>%
select(-ends_with('y')) %>%
rename_at(vars(ends_with('x')), ~gsub('.x','',.))
# A tibble: 3 x 3
# Groups: ID.x [3]
ID date value
<dbl> <date> <dbl>
1 1 2019-04-03 1.5
2 2 2019-05-13 1.2
3 3 2019-05-27 NA