每天汇总计算 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-01
到 2016-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
我想获取每天的病例数,包括零。这是我的数据框示例:
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-01
到 2016-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