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

基于药物给药排除蛋白测量值的R语言医学数据处理需求

解决方案

首先注意:原数据集中protein_B和protein_C的列名存在重复(均重复使用protein_B_1、protein_C_1),这会导致数据框无法正常构建,先修正列名:

# 修正重复列名
colnames(dataset)[grep("protein_B", colnames(dataset))] <- paste0("protein_B_", 1:6)
colnames(dataset)[grep("protein_C", colnames(dataset))] <- paste0("protein_C_", 1:6)

接下来使用tidyverse工具包处理数据,步骤如下:

1. 加载工具包

library(tidyverse)

2. 将宽格式数据转为长格式

把分散的蛋白测量日期、蛋白值列整合为长格式,便于按参与者和测量时间批量处理:

dataset_long <- dataset %>%
  pivot_longer(
    cols = starts_with(c("protein_date", "protein_A", "protein_B", "protein_C")),
    names_to = c(".value", "measurement_num"),
    names_pattern = "(.*)_(\\d+)"
  ) %>%
  mutate(measurement_num = as.integer(measurement_num))

3. 筛选符合要求的记录

对drug == "1"的参与者,保留测量日期早于trial_participation的记录;对drug == "0"的参与者保留全部数据:

processed_data <- dataset_long %>%
  group_by(Participant.Id) %>%
  mutate(
    # 对drug=1的参与者,定位第一个>=给药日期的测量序号
    cutoff = ifelse(drug == "1", 
                   min(measurement_num[protein_date >= trial_participation], na.rm = TRUE),
                   Inf),
    # 标记需要保留的记录
    keep = ifelse(drug == "0", TRUE, measurement_num < cutoff)
  ) %>%
  filter(keep | is.na(keep)) %>% # 处理NA值情况
  ungroup()

4. 转回宽格式(可选)

如果需要恢复原始的宽格式结构,执行以下代码:

processed_data_wide <- processed_data %>%
  select(-cutoff, -keep) %>%
  pivot_wider(
    names_from = measurement_num,
    values_from = c(protein_date, protein_A, protein_B, protein_C),
    names_glue = "{.value}_{measurement_num}"
  )

结果验证

以参与者1为例,其trial_participation为2014-06-16:

  • protein_date_3等于该日期,因此序号3及之后的蛋白值会被排除,最终保留protein_A_1/2、protein_B_1/2、protein_C_1/2,完全符合需求。

内容的提问来源于stack exchange,提问作者y.a

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 19:05:33