2016-04-24 19 views
0

我在v提供兩種dataframes:R:比較兩個dataframes日期和隔離符合特定時間段內R中的行

df1: 
ID Date Discharged 
1 2014-08-04 
2 2014-12-10 
3 2015-01-01 


df2: 
ID Check-in-Date 
1 2013-01-02 
1 2014-08-11 
2 2014-12-14 
2 2015-05-01 
3 2012-05-06 
3 2015-01-05 

我需要根據ID進行比較DF1與DF2,看看哪些人在出院後7天內檢查另一次約會。由於df2有重複的ID,我將如何完成此操作?

我想在df1中創建一個新列,如果簽入的人爲1,則爲0;否則爲0。如果他們在7天內辦理入住手續,我還需要一個帶有入住日期的新欄,如果沒有,我們需要留空。

NEW df1: 
ID Date Discharged Within_7days 7-day Checkin 
1 2014-08-04   1   2014-08-11 
2 2014-12-10   1   2014-12-14 
3 2015-01-01   1 
+0

在第二個df中,ID是否會顯示兩次以上? – Gopala

+0

是的,有些ID會在第二個df中顯示兩次以上。 – AlternativeHacks

回答

0

根據您的數據,您的最後一個示例應該有一個Within_7days值爲1的ID爲3的ID。

lubridate是偉大的工作時間。另外,我使用dplyr來操作數據集。

# Load Libraries 
library(dplyr) 
library(lubridate) 

# Recreate dataframes 
df1 <- data.frame(ID = 1:3, Date.Discharged = c("2014-08-04","2014-12-10","2015-01-01")) 
df2 <- data.frame(ID = c(1,2,2,3), CheckDate = c("2014-08-11","2014-12-14","2015-05-01","2015-01-05")) 

# Make the characters in Date.Discharged and CheckDate into Date objects: 
df1$Date.Discharged <- as.Date(df1$Date.Discharged) 
df2$CheckDate <- as.Date(df2$CheckDate) 

我假設你只關心入住日期的每個ID的最小值。這樣,如果您選擇最小值,則可以擺脫具有相同ID的多個條目的任何問題。

df2 <- df2 %>% group_by(ID) %>% summarize(CheckDate = min(CheckDate)) 
# Now join the 2 dataframes together 
df1 <- left_join(df1,df2) # this joins by ID by default 

最後,我們使列與Y/N

df1 <- df1 %>% mutate(within_7days = (CheckDate <= Date.Discharged + days(7))*1) 

df1 


    ID Date.Discharged CheckDate within_7days 
1 1  2014-08-04 2014-08-11   1 
2 2  2014-12-10 2014-12-14   1 
3 3  2015-01-01 2015-01-05   1 

編輯:

這是稍微低效率的,但如果你在第2個數據集有值將處理情況在排出日期之前發生:

我們可以忽略上面的以下行:

df2 <- df2 %>% group_by(ID) %>% summarize(CheckDate = min(CheckDate)) 

,而是直接去參加一步,如下修改:

df1 <- left_join(df1,df2) %>% filter(CheckDate > Date.Discharged) 

這將增加發生的所有各出院日期爲同一ID的CheckDates的。這再次假定DF1中的ID是唯一的。

+0

嗯,選擇最小值的問題是這樣的:對於df1中的ID#1,可能會有2014-08-04的日期,但在df2中可能有2013-01-01,2014-08-07的入住日期,等等。通過選擇最小值,我們忽略了在df1中我們所關注的那個之前可能存在日期的事實。 – AlternativeHacks