首先,准备数据帧:
# fix type
df1 <- mutate(df1, date = as.Date(date))
# fill NAs in df2
df2 <- df2 %>%
mutate(date = as.Date(date)) %>%
group_by(Id) %>%
tidyr::fill(price, date) %>%
ungroup
# fill remaining NAs with default values taken from df1
default_values <- df1 %>%
group_by(Id) %>%
slice(1) %>%
rename(price0 = price, date0 = date) %>%
ungroup
df2 <- df2 %>%
left_join(default_values, by = "Id") %>%
mutate(price = if_else(is.na(price), price0, price),
date = if_else(is.na(date), date0, date)) %>%
select(Id, price, date)
df1 %>%
left_join(df2, by = "Id") %>%
filter(date.y <= date.x + 30) %>%
group_by(Id, price.x, date.x) %>%
arrange(date.y) %>%
slice(n()) %>%
ungroup %>%
rename(initial_price = price.x, initial_date = date.x,
true_price = price.y, true_date = date.y) %>%
mutate(is_modification_price = (initial_price != true_price),
is_modification_date = (initial_date != true_date))
# # A tibble: 3 x 7
# Id initial_price initial_date true_price true_date is_modification_price is_modification_date
# <dbl> <dbl> <date> <dbl> <date> <lgl> <lgl>
# 1 1 1000 2016-01-01 2000 2016-01-05 TRUE TRUE
# 2 1 2000 2016-09-01 3000 2016-09-03 TRUE TRUE
# 3 2 1000 2016-01-01 1000 2016-01-05 FALSE TRUE
请注意
left_join
然后
filter
data.table
相反