r - 如何获得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 会在。
解决方案
编辑答案:
感谢您提供更多详细信息和说明。我的部分困惑是没有意识到日期格式是日-月-年而不是月-日-年。
您可以尝试以下使用data.table
. 首先确保您的日期是Date
对象(避免in
作为列名)。
您可以为每个id
. 然后,您可以使用uniqueN
on来获取每天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>)
推荐阅读
- c# - C# Unity 序列化哈希表永远不会被分配
- laravel-5 - 在 laravel 5 / vue app2 中切换语言
- gmail - 如何使用 gmail api 使用 3 个不同的 gmail 地址向同一用户发送 3 封邮件
- r - R数据表从不同的行添加列
- dataframe - 在比较 pyspark 中的两个数据帧时,如何找出新的内容和发生的变化?
- python - python - 如何连接列表中的两个索引
- ios - Deinit 从未调用自定义 UIView
- shell - 测试字符串外壳中现有的子字符串
- java - 如何在 java rest 模板客户端中修改部分 Content-Disposition
- python - 基于多个条件创建列的清洁方法