Левое скользящее соединение с ближайшей и предыдущей датой

Я хотел бы оставить информацию по ближайшей и предшествующей дате конкретных наблюдений. Я возьму в качестве примера этот набор данных:

ИДЕНТИФИКАТОР Дата1 А 2010-09-12 Б 2009-05-28 С 2008-04-16

Таблица для объединения информации выглядит следующим образом:

  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

Окончательная база данных, которую я хотел бы иметь, будет:

ИДЕНТИФИКАТОР Дата1 Рейтинг А 2010-09-12 1 Б 2009-05-28 3 С 2008-04-16 12

Как показано выше, важно отметить, что мне нужна предыдущая дата, даже если скрытая дата ближе, чем предыдущая.

Я пытался выполнить скользящее соединение data.table, но не уверен, что он будет иметь предварительный рейтинг по дате:

  test=df1[df2, roll = T]

Большое спасибо за вашу помощь!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Таблица данных

Вы были рядом:

  • в соединениях 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, хотя я признаюсь, что мне, как правило, нужно практиковать это на разных кадрах, чтобы действительно понять, как это использовать.

dplyr

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 был использован для вас.)

Или df1[ , Rating := df2[.SD, on = .(ID, Date1), roll = Inf, x.Rating]]

Henrik 18.04.2023 13:55

Какой отличный и полный ответ! Оба метода data.table и dplyr работали с моим набором данных. Большое спасибо

WalliYo_ 18.04.2023 16:51

Другие вопросы по теме