2015-11-30 3 views
-1

Я столкнулся с вопросами, на которые я не могу ответить с условным слиянием двух фреймов данных. Опишу кадры данных (имена изменены):Слияние 2 dataframes в r, связанных с датами, находящимися в пределах 30d друг от друга

  • Первый, DF1, имеет столбец под названием «proceduredate», который содержит дату процедуры в случае (уже отформатированный с помощью as.Date в формате% Y- % m-% d).
  • Вторая, DF2, имеет переменную, называемую «orderdate», которая содержит дату каждого лабораторного заказа (также форматируется как. Date в формате% Y-% m-% d).

Каждый dataframe имеет идентификатор (называемый «id») для каждого человека, который используется для объединения «по» через два блока данных. Я хотел бы объединить файлы данных условно, чтобы включить только экземпляры DF2, у которых есть orderdate в течение 30 дней после процедуры в DF1. Как я понимаю, это будет выглядеть что-то вроде:

if ([abs(DF1$procdate-DF2$orderdate)<=30]), then{ 
    merge(DF1,DF2,by="id") 
} 

Однако, я не могу понять способ превратить эту идею в рабочий код. Предложите ли вы какие-либо ссылки или аналогичные предыдущие решения?

+0

Почему бы вам просто не создать индекс каких строк, условие которых истинно и подмножество данных до этих строк, а затем слияние? – giraffehere

+0

Просьба привести воспроизводимый пример. –

+0

Спасибо за помощь. Я выяснил, что самый простой способ сделать это - подмножество данных с помощью другой переменной даты, слияние на несколько файлов, rbind их, а затем подмножество конечного результирующего фрейма данных по этим датам. Следующий проект попробует это в SQL, как предложено ниже. Благодаря! – user3068408

ответ

1

SQL обрабатывает это лучше, чем (базовый) R - хотя я считаю, что есть способ сделать это в data.table.

library(sqldf) 
result = sqldf(" 
    select * 
    from DF1 left join DF2 on 
    abs(DF1.procdata - DF2.orderdate) <= 30 
    AND DF1.id = DF2.id 
") 

Я не уверен, что это будет работать с датами, может быть, если они Date столбцы класса. Если вы предоставите воспроизводимый пример, я с удовольствием проверю.

+0

Спасибо! Я пробовал это на своих фреймах данных, но это не совсем сработало. Я сумел сделать это более clunkier, используя подмножество dataframes другим столбцом даты, слиянием, rbinding, а затем подмножество окончательного результата. Это заняло больше времени, но написание функции для него, как только я подумал, что этот метод создал воспроизводимый результат. – user3068408

+1

Этот ответ, кажется, отвечает на вопрос. Проблема - вопрос, а не ответ. Этот вопрос не обеспечивал требуемый минимальный самодостаточный воспроизводимый пример (включая все входы), но насколько это было представлено в вопросе, я думаю, что это правильный ответ и его нужно проверить. –

Смежные вопросы