Я хотел бы оставить информацию по ближайшей и предшествующей дате конкретных наблюдений. Я возьму в качестве примера этот набор данных:
Таблица для объединения информации выглядит следующим образом:
ID Date1 Rating
1 A 2010-06-13 1
2 A 2010-10-03 7
3 B 2008-12-28 3
4 B 2009-06-28 5
5 C 2008-01-02 12
6 C 2008-05-23 6
Окончательная база данных, которую я хотел бы иметь, будет:
Как показано выше, важно отметить, что мне нужна предыдущая дата, даже если скрытая дата ближе, чем предыдущая.
Я пытался выполнить скользящее соединение data.table, но не уверен, что он будет иметь предварительный рейтинг по дате:
test=df1[df2, roll = T]
Большое спасибо за вашу помощь!
Вы были рядом:
data.table
таблица LHS находится внутри скобки (пока нет присваивания соединения... возможно, это сбивает с толку);
[
-скобку как «правое соединение», где при использовании dt2[dt1,...]
dt1
является первичным, данные присоединяются к dt1
;dt1[dt2, newval := i.otherval, on = .(id, quux)]
), это на самом деле левое соединение ... почти наверняка сбивает с толку.on=
.df2[df1, on = .(ID, Date1), roll = TRUE]
# ID Date1 Rating
# <char> <char> <int>
# 1: A 2010-09-12 1
# 2: B 2009-05-28 3
# 3: C 2008-04-16 12
Другой способ взглянуть на это — выполнить соединение с присвоением, которое меняет порядок таблиц. Одним из преимуществ этого является то, что он позволяет выбирать определенные столбцы, включая df2$Date1
:
df1[df2, c("Rating", "Date1.y") := .(i.Rating, i.Date1), on = .(ID, Date1), roll = -Inf]
# ID Date1 Rating Date1.y
# <char> <char> <int> <char>
# 1: A 2010-09-12 1 2010-06-13
# 2: B 2009-05-28 3 2008-12-28
# 3: C 2008-04-16 12 2008-01-02
Обратите внимание на использование roll = -Inf
. Подробнее можно прочитать в ?data.table, хотя я признаюсь, что мне, как правило, нужно практиковать это на разных кадрах, чтобы действительно понять, как это использовать.
library(dplyr) # >= 1.1.0
df1 %>%
left_join(df2, join_by(ID, closest(Date1 >= Date1)),
suffix = c("", ".y")) %>%
select(-Date1.y)
# ID Date1 Rating
# <char> <char> <int>
# 1: A 2010-09-12 1
# 2: B 2009-05-28 3
# 3: C 2008-04-16 12
Поскольку скользящее соединение здесь включает Date1.x
и Date1.y
в качестве выходных столбцов, я мог бы обойтись без suffix=
и вместо этого закончить с select(ID, Date1=Date1.x, Rating)
(и любыми другими реальными столбцами, которые у вас есть), но я думаю, что обычно проще принудительно использовать суффикс (сохраняя имя столбца LHS без изменений) и удаление присоединенного столбца. (Хотя вам может быть интересно узнать, какой df2$Date1
был использован для вас.)
Какой отличный и полный ответ! Оба метода data.table и dplyr работали с моим набором данных. Большое спасибо
Или
df1[ , Rating := df2[.SD, on = .(ID, Date1), roll = Inf, x.Rating]]