R:比较两个dataframes日期和隔离符合特定时间段内R中的行

问题描述:

我在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

根据您的数据,您的最后一个示例应该有一个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