如何获得R中两个日期之间的计数?

How to get the number of counts between two dates in R?

我有以下数据框

df<-data.frame(id=seq(from = 1, to=100), in= c("01-01-2020", "01-01-2020", "01-01-2020", "01-01-2020", "02-01-2020", "02-01-2020",  "02-01-2020", "02-01-2020"...), out=c("02-01-2020",  "20-01-2020", "02-05-2020", "02-04-2020", "02-03-2020"...)

我想从中得到一个数据框,它可以告诉我们每天有多少个唯一 ID。 像这样

df2<-data.frame(day=c("01-01-2020", "02-01-2020", "03-01-2020", "04-01-2020"...), count = c(5,6,1,2,3...))

例如假设我们只有两个id; id 1 date_in = "01-01-2020" and date out = "08-01-2020", and id 2 date_in = "05-01-2020" and date_out = “25-01-2020”。然后所需的数据帧将是以下一个:

df2= data.frame(day = c("01-01-2020", "02-01-2020", "03-01-2020", "04-01-2020", "05-01-2020", "06-01-2020", "07-01-2020", "08-01-2020", "09-01-2020", "10-01-2020"...), count = c(1,1,1,1,2,2,2,1,1,1,...))

由于 id 1 是 1 月 1 日至 5 日之间唯一的一个,因此计数为 1,5-8 之间,因为 id 1 和 id 2 在计数中为 2,而 1 月 8 日之后计数将只是 1 就像 id 2 一样。

已编辑答案:

感谢您提供更多详细信息和说明。我的部分困惑是没有意识到日期格式是日-月-年而不是月-日-年。

您可以使用 data.table 尝试以下操作。首先确保您的日期是 Date 个对象(避免 in 作为列名)。

您可以为每个 id 创建天数序列。然后,您可以在 id 上使用 uniqueN 来获取每天唯一 id 的数量。

library(data.table)

df$day_in <- as.Date(df$day_in, format = "%d-%m-%Y")
df$day_out <- as.Date(df$day_out, format = "%d-%m-%Y")

setDT(df)[ , .(id = id, day = seq(day_in, day_out, by = "day")), 
           by = 1:nrow(df)][, .(count = uniqueN(id)), .(day)]

或者,您可以使用 tidyverse。在这里,您还将为每个 id 创建日期序列,然后为每个日期 group_by 创建日期序列,并使用 n_distinct.

计算唯一 ID
library(tidyverse)

df %>% 
  transmute(id, day = map2(day_in, day_out, seq, by = "1 day")) %>%
  unnest(cols = c(day)) %>%
  group_by(day) %>%
  summarise(count = n_distinct(id))

输出

           day count
 1: 2020-01-01     1
 2: 2020-01-02     1
 3: 2020-01-03     1
 4: 2020-01-04     1
 5: 2020-01-05     2
 6: 2020-01-06     2
 7: 2020-01-07     2
 8: 2020-01-08     2
 9: 2020-01-09     1
10: 2020-01-10     1
11: 2020-01-11     1
...

数据

df <- structure(list(id = 1:2, day_in = structure(c(18262, 18266), class = "Date"), 
    day_out = structure(c(18269, 18286), class = "Date")), row.names = c(NA, 
-2L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x7fd59b010ee0>)