如何获得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>)
我有以下数据框
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
.
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>)