我想改变 tibble
其中通过查找外部“日期查找表”包含日期列表:
date_lookup<-tibble(start = lubridate::dmy("01012020", "01022020"),
end = lubridate::dmy("31012020", "28022020"),
id = c(1, 2))
df<-tibble(record = c("A", "B"),
date = lubridate::dmy("15022020", "03012020"))
如果日期在 df
介于 date_lookup
中的开始日期或结束日期之间我想拉过适当的id
来自date_lookup
.
我尝试过以下方法:
df %>% rowwise() %>%
mutate(id = ifelse(between(date, date_lookup$start, date_lookup$end), date_lookup$id, NA))
但是正如您所看到的,df
中的第一行显示为NA
(它应该显示数字 2)。
预期输出:
# A tibble: 2 x 3
# Rowwise:
record date id
<chr> <date> <dbl>
1 A 2020-02-15 2
2 B 2020-01-03 1
一个dplyr
解决方案会更好。
最佳答案
您可以在此处使用fuzzyjoin
:
fuzzyjoin::fuzzy_inner_join(df, date_lookup,
by = c('date' = 'start', 'date' = 'end'), match_fun = list(`>=`, `<=`))
# A tibble: 2 x 5
# record date start end id
# <chr> <date> <date> <date> <dbl>
#1 A 2020-02-15 2020-02-01 2020-02-28 2
#2 B 2020-01-03 2020-01-01 2020-01-31 1
使用tidyverse
函数:
tidyr::crossing(df, date_lookup) %>% dplyr::filter(date >= start, date <= end)
关于r - 在外部查找表的日期之间进行变异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62912260/