You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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)

输出结果将符合示例要求:

analytemethodcount
cholold16
cholnew16
ldhold18
ldhnew18

内容的提问来源于stack exchange,提问作者denis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:52:07