首页 > 解决方案 > 如何获得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" 和 date out = "08-01-2020",id 2 date_in = "05-01-2020" 和 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 会在。

标签: rdatecountbetween

解决方案


编辑答案:

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

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

您可以为每个id. 然后,您可以使用uniqueNon来获取每天id唯一的数量。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每个日期,并计算具有 的唯一 ID n_distinct

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>)

推荐阅读