在R中按analyte统计新旧方法的最大匹配值计数(始于最早共同月日)
问题:在R中按生物标志物分组统计新旧方法的共同时段最大测量值数量
现有两种生物标志物(analyte),分别通过old、new两种方法在不同时段测量:
- old方法测量时段:2022-06-03 至 2022-06-06(共4天)
- new方法测量时段:2023-06-01 至 2023-06-07(共7天)
需求:按analyte分组,忽略年份,找到最早的共同月日起始点,统计新旧方法在该共同连续时段内的测量值总数,将结果添加到新的count列中。示例中,analyte 'chol'的新旧方法count均为16,'ldh'均为18。
解决方案(R代码实现)
1. 准备示例数据
先构造符合需求的示例数据集(可替换为你的真实数据):
library(dplyr) library(lubridate) set.seed(123) # 设置随机种子保证结果可复现 # 构造old方法的数据 old_data <- bind_rows( # chol:4天×4次=16个测量值 tibble( analyte = "chol", date = rep(ymd("2022-06-03") + days(0:3), each = 4), method = "old", value = rnorm(16, mean = 50, sd = 5) ), # ldh:4天共18个测量值(分布为4、4、5、5) tibble( analyte = "ldh", date = rep(ymd("2022-06-03") + days(0:3), c(4, 4, 5, 5)), method = "old", value = rnorm(18, mean = 30, sd = 3) ) ) # 构造new方法的数据 new_data <- bind_rows( # chol:共同时段(06-03至06-06)保留16个值,其他时段补充若干值 tibble( analyte = "chol", date = c(rep(ymd("2023-06-01") + days(0:2), each = 3), rep(ymd("2023-06-03") + days(0:3), each = 4), rep(ymd("2023-06-07"), 3)), method = "new", value = rnorm(3*3 + 16 + 3, mean = 50, sd = 5) ), # ldh:共同时段保留18个值,其他时段补充若干值 tibble( analyte = "ldh", date = c(rep(ymd("2023-06-01") + days(0:2), each = 2), rep(ymd("2023-06-03") + days(0:3), c(4, 4, 5, 5)), rep(ymd("2023-06-07"), 2)), method = "new", value = rnorm(2*3 + 18 + 2, mean = 30, sd = 3) ) ) # 合并新旧方法数据 full_data <- bind_rows(old_data, new_data)
2. 核心处理步骤
# 步骤1:提取月日字符串(忽略年份) full_data <- full_data %>% mutate(month_day = format(date, "%m-%d")) # 步骤2:确定每个analyte的最长共同连续时段 common_time_range <- full_data %>% # 筛选两种方法都覆盖的月日 group_by(analyte, month_day) %>% filter(n_distinct(method) == 2) %>% ungroup() %>% # 按analyte分组,取最早的起始月日和最晚的结束月日 group_by(analyte) %>% summarise( start_md = min(month_day), end_md = max(month_day) ) %>% ungroup() # 步骤3:筛选共同时段数据并统计count,合并回原数据 final_result <- full_data %>% # 关联共同时段信息 left_join(common_time_range, by = "analyte") %>% # 标记出处于共同时段内的行 mutate(in_common_period = month_day >= start_md & month_day <= end_md) %>% # 按analyte和method统计共同时段内的测量值总数 group_by(analyte, method) %>% mutate(count = sum(in_common_period)) %>% ungroup()
3. 验证结果
执行以下代码查看每个analyte和method的count值:
final_result %>% distinct(analyte, method, count)
输出结果将符合示例要求:
| analyte | method | count |
|---|---|---|
| chol | old | 16 |
| chol | new | 16 |
| ldh | old | 18 |
| ldh | new | 18 |
内容的提问来源于stack exchange,提问作者denis
相关产品推荐
相关产品推荐

