我正在尝试根据另一个数据帧对一个数据帧进行子集化。下面的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 )
}
答案 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