R:比较两个数据帧中的日期,并隔离R中某个时间段内匹配的行

时间:2016-04-24 18:09:35

标签: r dataframe

我在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。如果他们在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

1 个答案:

答案 0 :(得分:0)

根据您的数据,您的上一个示例的ID为3时,其Within_7days值应为1。

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

修改

这效率稍低,但会处理第二个数据集中出现在出院日期之前的值的情况:

我们可以忽略上面的以下一行:

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

而是直接进入连接步骤并按如下方式修改:

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

这将添加针对相同ID每个日期发布的所有CheckDate。这再次假设DF1中的ID是唯一的。