【问题标题】:R Function To Count Entries Within Date RangeR函数计算日期范围内的条目
【发布时间】:2020-01-13 18:51:45
【问题描述】:

我正在尝试向数据框中添加一个字段,该字段是第二个数据框中所有条目的计数,其中 ID 字段具有相同的值,并且来自 dataframe1 的日期在 dataframe2 中两个不同列的日期范围内

df1$ACTIVE<- for(i in df1$ID){ifelse(DF2$ID == DF1$ID & df2$START < df1$DATE < df2$end,1,0)}

【问题讨论】:

标签: r date for-loop counting


【解决方案1】:

你的问题很难理解。一些示例将大大有助于清除您正在尝试做的事情。 这是我的理解:您想将tbl1 中的idtbl2 进行比较。如果 id 匹配,您想知道来自tbl1date 介于start 和来自tbl2end 之间的频率。

首先,我将创建一些假数据。

library(tidyverse)

tbl1 <- tribble(
  ~id, ~date,
  1, "2018-01-01",
  2, "2018-01-01",
  3, "2018-01-01",
  5, "2018-01-01"
) %>% 
  mutate(date = as.Date(date))


tbl2 <- tribble(
  ~id, ~start, ~end,
  1, "2017-01-01", "2019-01-01",
  1, "2016-01-01", "2019-01-01",
  1, "2015-01-01", "2019-01-01",
  2, "2017-01-01", "2019-01-01",
  2, "2019-01-01", "2020-01-01",
  3, "2019-01-01", "2020-01-01",
  4, "2019-01-01", "202o-01-01"
) %>% 
  mutate(start = as.Date(start), 
         end = as.Date(end))

我们应该发现 ID 1 在范围内 3 次,ID 2 在范围内一次,ID 3 在范围内零次。我们将从 tbl1 中删除 id 5,因为它不在 tbl2 中,我们将忽略 ID 4,因为它不在 tbl1 中。

这可以通过几个步骤来完成。首先我们使用inner_join 只保留匹配的ID。然后我们判断日期是否为in_range,最后,对于每个id,我们计算日期为in_range的次数。

tbl3 <- tbl1 %>% 
  inner_join(tbl2, by = "id") %>% 
  mutate(in_range = date > start & date < end) %>% 
  group_by(id) %>% 
  summarize(count = sum(in_range))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-05
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2016-05-18
    相关资源
    最近更新 更多