【问题标题】:Counting occurance based on timeframes in a second data frame根据第二个数据帧中的时间帧计算发生次数
【发布时间】:2022-11-17 06:03:15
【问题描述】:

这让我很头疼,想知道我是否能得到一些建议。

我有 2 个数据框

df1 = data.frame("ID" = c("a", "b", "a", "c", "a", "b"), 
                 "date" = as.Date(c("2020-1-1", "2020-1-2", "2020-1-5","2020-1-10", "2020-1-10", "2020-1-15"))

df2 = data.frame("ID" = c("a", "b", "a", "c"), 
                 "start" = as.Date(c("2019-12-30", "2020-1-1", "2020-1-5","2020-1-10")), 
                 "end" = as.Date(c("2020-1-3", "2020-1-2", "2020-1-12","2020-1-14")))

对于 df2 中的每一行,我想计算在规定的开始/结束日期内发生的 df1 中的观察次数。

结果应如下所示:

df3 = data.frame("ID" = c("a", "b", "a", "c"), 
                 "start" = as.Date(c("2019-12-30", "2020-1-1", "2020-1-5","2020-1-10")), 
                 "end" = as.Date(c("2020-1-3", "2020-1-2", "2020-1-12","2020-1-14")), 
                 "count" = c("1", "1", "2", "1"))

我见过的大多数解决方案都涉及一些 group_by 或 merge 函数,当我想要保留的 df2 中多次出现相同的 ID 时,这些函数会变得混乱。

有什么建议么?谢谢!

【问题讨论】:

  • 无关但仅供参考:您不需要将数据框列名放在引号中。

标签: r


【解决方案1】:

我们可以这样做: 首先按 ID 加入(使用 inner_join),然后在 ifelse 语句中检查日期是否在开始和结束之间。 下一个分组是获得 OP 所需输出的必要条件,最后总结一下:

library(dplyr)
inner_join(df1, df2, by = "ID") %>% 
  rowwise() %>%
  mutate(match = ifelse(between(date, start, end), 1, 0)) %>%
  group_by(ID, start, end) %>% 
  summarise(n = sum(match))
  ID    start      end            n
  <chr> <date>     <date>     <dbl>
1 a     2019-12-30 2020-01-03     1
2 a     2020-01-05 2020-01-12     2
3 b     2020-01-01 2020-01-02     1
4 c     2020-01-10 2020-01-14     1

【讨论】:

    猜你喜欢
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 2020-06-22
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2013-01-31
    相关资源
    最近更新 更多