给定条件,计算另一个数据框中的条目数

时间:2018-07-09 18:59:16

标签: r dataframe count plyr tidyr

我有以下问题:我有两个数据框。 df1除其他变量(在下面的代码中未显示)之外,还包含一个日期变量。在df2中,我有一个ID(指表df1中的ID),一个因子变量(类型)和另一个日期。

df1 <- data.frame(id=1:5, referenceDate=c("2018-01-20","2018-02-03","2018-05-20", "2018-08-01", "2018-07-31"))
df2 <- data.frame(id=c(1,1,1,2,2,4,4,5,5), type=c("A", "A", "B", "A", "A", "B", "A", "B", "B"), dates=c("2018-01-10", "2018-01-23", "2018-01-24", "2018-05-21", "2018-05-18", "2018-06-01", "2018-09-01", "2018-07-10", "2018-07-20"))

我的目标是在df1中创建一个新列,指示df2中的行数,其中df2$type =='A'和df2$dates出现在df1$referenceDate

在R中,我有以下解决方案,可为我提供df2$type =='A'的行数。但是我该如何考虑日期呢?我的想法是先将两个表连接起来,以便将referenceDate的{​​{1}}变量转换为df1,然后进行计数,然后再朝另一个方向将两个表连接起来(为了使count变量返回到df2中)。但这对我来说听起来并不优雅。

df1

1 个答案:

答案 0 :(得分:0)

我想这可能是您想要的:

df1 <- tibble(id = 1:5, 
              referenceDate = as.Date(c("2018-01-20","2018-02-03","2018-05-20", "2018-08-01", "2018-07-31")))

df2 <- tibble(id = c(1,1,1,2,2,4,4,5,5), 
              type = c("A", "A", "B", "A", "A", "B", "A", "B", "B"), 
              dates = as.Date(c("2018-01-10", "2018-01-23", "2018-01-24", "2018-05-21", "2018-05-18", "2018-06-01", "2018-09-01", "2018-07-10", "2018-07-20")))


df1 %>% 
  left_join(
    df2 %>% 
      left_join(df1, by = 'id') %>% 
      filter(dates < referenceDate) %>% 
      group_by(id) %>% 
      count(type) %>% 
      ungroup(),
    by = 'id'
  )

关键是首先将df1df2连接到{em> ,然后根据参考日期进行过滤。这样,您就可以使用filter保留想要的内容。然后,使用count然后重新加入df1