基于药物给药排除蛋白测量值的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
相关产品推荐
相关产品推荐

