每天汇总计算 R 中的不同 ID

Aggregate per day counting different IDs in R

我想获取每天的病例数,包括零。这是我的数据框示例:

set.seed(1453); ID = sample(1:4, 10, TRUE)
date = c('2016-01-01', '2016-01-05', '2016-01-07',  '2016-01-12',  '2016-01-16',  '2016-01-20',
         '2016-01-20',  '2016-01-25',  '2016-01-26',  '2016-01-31')
df = data.frame(ID, date = as.Date(date))

所以我知道 2016-01-01 ID 1 有一个案例,[=17= ID 1 有一个案例].所以我想在这两天获得一个从 2016-01-012016-01-31 的数据框,其中 1 否则 0 。每个 ID 我都会喜欢。因此,此示例显示每个 ID 一个事件,但在我的实际数据框中,我每天每个 ID 最多有 15 个案例。

我用过:

M <- function(timeStamps) {
  Dates <- as.Date(strftime(df$date, "%Y-%m-%d"))
  allDates <- seq(from = min(Dates), to = max(Dates), by = "day")
  Admission <- sapply(allDates, FUN = function(X) sum(Dates == X))
  data.frame(day = allDates, Admission = Admission)
}
MM<-M(df$date)

但是如果我为每个 ID.

创建一个数据框,MM 只会给我想要的结果

我使用 完成了同样的练习,但我在这里得到的是月度汇总结果。理想情况下,考虑到每个 ID.

0 个事件,我每天能够聚合一个类似的数据框

使用当前函数,我们可以 split 'date' by 'ID' 列,应用函数,并且 rbind list 输出到单个 data.frame 与 ID 作为另一列

lst1 <- lapply(split(df$date, df$ID), M)
out <- do.call(rbind, Map(cbind, ID = names(lst1), lst1))
row.names(out) <- NULL

-输出

> str(out)
'data.frame':   124 obs. of  3 variables:
 $ ID       : chr  "1" "1" "1" "1" ...
 $ day      : Date, format: "2016-01-01" "2016-01-02" "2016-01-03" "2016-01-04" ...
 $ Admission: int  1 0 0 0 1 0 1 0 0 0 ...
> head(out)
  ID        day Admission
1  1 2016-01-01         1
2  1 2016-01-02         0
3  1 2016-01-03         0
4  1 2016-01-04         0
5  1 2016-01-05         1
6  1 2016-01-06         0

或使用tidyverse,按操作分组

library(dplyr)
library(tidyr)
df %>%
  group_by(ID) %>% 
  summarise(out = M(date), .groups = 'drop') %>%
  unpack(out)

-输出

# A tibble: 124 × 3
      ID day        Admission
   <int> <date>         <int>
 1     1 2016-01-01         1
 2     1 2016-01-02         0
 3     1 2016-01-03         0
 4     1 2016-01-04         0
 5     1 2016-01-05         1
 6     1 2016-01-06         0
 7     1 2016-01-07         1
 8     1 2016-01-08         0
 9     1 2016-01-09         0
10     1 2016-01-10         0
# … with 114 more rows