如何基于另一个数据帧在For循环内对数据帧进行子集化?

时间:2020-08-11 15:47:42

标签: r dataframe date dplyr subset

我正在尝试根据另一个数据帧对一个数据帧进行子集化。下面的Df1具有主题和日期。 Df2具有subjectid,firstdate和lastdate。两个数据框共享相同的主题ID,并且每个主题都有多个行(多个日期),这就是执行for循环而不是合并/联接的原因。 (也由于以后使用) 我想将df2子集化为仅包含日期(来自df1)的日期介于firstdate和lastdate(df2)之间的数据框。

df1看起来像:

subjectid   date 
1         2020-07-16
1         2020-07-17
1         2020-07-18
1         2020-07-19
1         2020-07-20
1         2020-07-21
2         2020-07-22
2         2020-07-23
2         2020-07-24
2         2020-07-25
2         2020-07-26
2         2020-07-27

df2看起来像:

subjectid firstdate    lastdate   
1         2020-07-10   2020-07-17      
1         2020-07-17   2020-07-22      
1         2020-07-22   2020-07-27      
2         2020-07-19   2020-07-24      
2         2020-07-24   2020-07-27      
2         2020-07-27   2020-07-30      
3         2020-07-11   2020-07-18      
3         2020-07-18   2020-07-23      

我尝试了下面的代码,但df2的观察结果为0。 我在下面的代码中缺少什么?任何帮助,将不胜感激。 (我无法将合并或联接用于此数据框的以后使用。两者在实际数据集中都具有更多变量)

for (i in 1:nrow(df1) ) {
day_i <- df1[i,'date'] 
id <- df1[i,'subjectid'] 
df2 <- subset(df2, subjectid == id & firstdate <= day_i & lastdate 
>= day_i )
 }

1 个答案:

答案 0 :(得分:0)

尝试一下

library(tidyverse)
library(lubridate)
df1_tmp <- df1 %>% 
  group_by(subjectid) %>% 
  summarise(int_df1 = interval(min(date), max(date)))

left_join(df2, df1_tmp) %>% 
  filter(int_overlaps(int1 = interval(firstdate, lastdate),
                      int2 = int_df1)) %>% 
  select(-int_df1)

Joining, by = "subjectid"
  subjectid  firstdate   lastdate
1         1 2020-07-10 2020-07-17
2         1 2020-07-17 2020-07-22
3         2 2020-07-19 2020-07-24
4         2 2020-07-24 2020-07-27
5         2 2020-07-27 2020-07-30