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

如何在R中为受试者各Protocol的日期添加测试日序号列?

实现方案:按受试者+Protocol生成测试日序号

核心思路是按受试者(Subject)和实验方案(Protocol)分组,对每组内的测试日期(StartDate)按先后顺序编号,相同日期标记为同一天序号,不同日期依次递增,完全适配日期不连续的场景。

Python(Pandas)实现

针对大型数据集,Pandas的分组排名操作效率很高,推荐用rank方法快速生成序号:

import pandas as pd

# 先确保日期列是datetime格式(若原始数据是字符串)
df['StartDate'] = pd.to_datetime(df['StartDate'])

# 分组生成Day列:同一Subject+Protocol下,按StartDate的先后顺序编号,相同日期共享同一序号
df['Day'] = df.groupby(['Subject', 'Protocol'])['StartDate'].rank(method='dense', ascending=True).astype(int)
  • method='dense':保证相同日期的序号一致,不同日期按顺序连续递增(不会跳过序号)
  • astype(int):把浮点型的排名结果转为整数,符合"第1天、第2天"的需求

如果需要先查看每组的日期-序号映射关系,可以用以下方式:

# 生成分组内的日期-Day映射表
date_day_mapping = df.groupby(['Subject', 'Protocol'])['StartDate'].unique().apply(
    lambda dates: pd.Series(range(1, len(dates)+1), index=sorted(dates))
).stack().reset_index(name='Day')

# 合并回原数据(和rank方法结果一致)
df2 = df.merge(date_day_mapping, on=['Subject', 'Protocol', 'StartDate'])

R(dplyr)实现

用dplyr的分组+dense_rank函数实现同样逻辑:

library(dplyr)

# 转换日期格式
df <- df %>% mutate(StartDate = as.Date(StartDate))

# 分组生成Day列
df2 <- df %>%
  group_by(Subject, Protocol) %>%
  mutate(Day = dense_rank(StartDate)) %>%
  ungroup()
  • dense_rank(StartDate):对每组内的日期按从小到大排序,相同日期返回相同排名,不同日期依次递增

其他思路

如果后续需要扩展逻辑(比如将间隔≤N天的测试视为同一"测试周期"),可以在分组后对日期做差值计算,再根据差值阈值调整序号。但针对当前需求,上述方法已经完全满足,且处理大型数据集的效率足够。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:35:18