2016-03-18 1 views
0

Я пытаюсь создать набор данных, аналогичный тому, как CMS публикует referral data. Короче говоря, два врача связаны, если они видят одного и того же пациента в течение 30 дней после другого.Идентификация пар строк в dataframe, где даты указаны в пределах указанного количества дней

У меня есть набор данных, который содержит пациент, врач и дату назначения, например:

df <- data.frame(
    doctor = c("Dr. Who", "Dr. Pepper", "Dr.Bob", "Dr. Strangelove"), 
    patient = c("Mickey", "Mickey", "Mickey", "Mickey"), 
    date = c("2015-01-15", "2015-01-21", "2015-04-01", "2015-02-18") 
) 

С выше набором данными, я хотел бы написать некоторый R код возврата будет:

  • Доктор Кто, доктор Пеппер (потому что они видят Микки в течение 6 дней друг с другом)
  • Dr. Pepper, Dr. Strangelove (они видят Микки в течение 28 дней друг от друга)

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

На простом английском языке, как я бы обрабатывать эту проблему:

  1. Соберите все назначения пациента
  2. Для каждой даты назначения, найти разницу в днях от всех остальных дней назначения
  3. Верните пары врачей для любых двух встреч, которые составляют +/- 30 дней друг от друга.

Пожалуйста, дайте мне знать, если я могу улучшить свой вопрос в любом случае. Благодарю.

ответ

1

Вы можете сделать это с помощью mapply, который применяет многомерную функцию по-разному. Здесь он проходит через столбцы doctor и date, подмножество df врачам, связанным с датами в течение 30 дней, которые не являются тем же врачом, что и это назначение. Несколько совпадений сочетаются с paste(... , collapse = ', ').

df$linked_doc <- mapply(
    function(doc, date){paste(
    df[abs(date - df$date) < 30 & doc != df$doctor, 'doctor'], 
    collapse = ', ')}, 
    df$doctor, df$date) 

df 
#   doctor patient  date    linked_doc 
# 1   Dr. Who Mickey 2015-01-15    Dr. Pepper 
# 2  Dr. Pepper Mickey 2015-01-21 Dr. Who, Dr. Strangelove 
# 3   Dr.Bob Mickey 2015-04-01       
# 4 Dr. Strangelove Mickey 2015-02-18    Dr. Pepper 

Есть и другие способы сделать это, конечно. Если у вас несколько пациентов, перед применением функции вы можете split на patient.

+0

Спасибо! Я думаю, мне нужно вернуться к старому коду и посмотреть, где еще я могу использовать mapply. Мне любопытно - есть ли еще одна строка кода, которую вы использовали для изменения даты df $ в соответствующий класс, который будет работать с решением, которое вы дали? Я должен был сделать что-то вроде: 'df $ date <-parse_date_time (df $ date,"% y% m% d ") df $ linked_doc <- mapply ( function (doc, date) {paste ( df [ abs (date - df $ date) <2592000 & doc! = df $ doctor, 'doctor'], collapse = ',')}, df $ doctor, df $ date) 'где 2592000 - 30 дней в секундах. Когда я попытался использовать difftime (..), я получил ошибки типа var – MCharles

+1

Извините, я должен был включить это! Вам нужен формат даты, а не дата-время. В этом случае вам нужно только 'df $ date <- as.Date (df $ date)'. Поскольку ваши даты уже в формате ISO, вам даже не нужно передавать ему строку синтаксического анализа! – alistaire

+0

Связанный вопрос - как бы вы шли на расщепление на пациента в первую очередь? Является ли это вопросом гнездования карполя внутри? – MCharles

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