我在R中有纵向患者数据。我想从表1创建一个聚合表,如下面的表2。因此,表2对于每个患者只有一行,并且具有登记日期之前的咨询总数(表1中的第3列(和登记日期之后的咨询总数
表1:
patid | consultation_date | registration_date | consultation_count | |
---|---|---|---|---|
1 | 2016年7月 | 2018年7月 | 1||
1 | 2019年7月7日 | 2018年07月7日 | 1 | |
1 | 2020年7月7日 | 2018年7月07日1 | ||
2 | 2016年8月14日 | 2016年9月7日 | 1 | |
2 | 2015年5月7日 | 2016年9月7日 | 1 | |
2 | 2016年12月2日 | 2016月9日 | 1 |
在使用tidyverse
时与akrun类似,但方法略有不同:
library(dplyr)
library(tidyr)
consultations |>
mutate(period = ifelse(
registration_date <= consultation_date,
"after registration",
"before registration"
)
) |>
group_by(patid, period) |>
summarise(n = n()) |>
pivot_wider(
names_from = period,
values_from = n
)
# A tibble: 2 x 3
# Groups: patid [2]
# patid `after registration` `before registration`
# <int> <int> <int>
# 1 1 2 1
# 2 2 1 2
数据
consultations <- read.table(text = "patid consultation_date registration_date consultation_count
1 07/07/2016 07/07/2018 1
1 07/07/2019 07/07/2018 1
1 07/07/2020 07/07/2018 1
2 14/08/2016 07/09/2016 1
2 07/05/2015 07/09/2016 1
2 02/12/2016 07/09/2016 1", h=T)
我们可以将"date"转换为Date
类,然后按"patid"分组,从"consultation_date"one_answers"registration_date"中获得逻辑向量的sum
library(dplyr)
library(lubridate)
df1 %>%
mutate(across(ends_with('date'), dmy)) %>%
group_by(patid) %>%
summarise(
count_pre = sum(consultation_date < registration_date, na.rm = TRUE),
count_post = sum(consultation_date > registration_date, na.rm = TRUE),
.groups = 'drop')
-输出
# A tibble: 2 × 3
patid count_pre count_post
<int> <int> <int>
1 1 1 2
2 2 2 1
数据
df1 <- structure(list(patid = c(1L, 1L, 1L, 2L, 2L, 2L),
consultation_date = c("07/07/2016",
"07/07/2019", "07/07/2020", "14/08/2016", "07/05/2015", "02/12/2016"
), registration_date = c("07/07/2018", "07/07/2018", "07/07/2018",
"07/09/2016", "07/09/2016", "07/09/2016"), consultation_count = c(1L,
1L, 1L, 1L, 1L, 1L)), class = "data.frame", row.names = c(NA,
-6L))